ワンライナー
cron内容が記載されている/var/spool/cron/crontabs/rootに対して
# DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.HthPYB/crontab installed on Sat Aug 10 04:32:46 2019) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) # Edit this file to introduce tasks to be run by cron. 00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
以下のワンライナーを発行すると
# cat /var/spool/cron/crontabs/root | sed 's/^#.*//g' | sed '/^$/d'
標準出力は以下になります。
00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
これらのコードはよく見かけますが、本記事では使い分け含めて解説しました。
解説
タイトルを行うケースというのは多々あり、サーバエンジニアの方であれば空で打てるようになっておきたいものです。
前段部分
sedコマンドによる置換、 's/置換前/置換後/g'
を利用します。
コメント行は先頭に「#」がついているという前提に立って「^」入りの
sed 's/^#.*//g'
としています。
これは例えばファイルの中に
echo "#1"
といった記載があった場合に結果が変わってくるからです。
上記一文が挿入されている場合「^」がなければ
# cat /var/spool/cron/crontabs/root | sed 's/#.*//g' | sed '/^$/d'
以下のようにecho "と途中から消えてしまいます。
echo " 00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
これは#.*
にもある通り「#」から後ろを全て消しているからです。
ところが「^」をつけるデメリットもあり、コメント部分にスペース等が挿入されている場合は
# DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.HthPYB/crontab installed on Sat Aug 10 04:32:46 2019) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) # Edit this file to introduce tasks to be run by cron.
「^」の持つ先頭文字という条件から外れるため
# cat /var/spool/cron/crontabs/root | sed 's/^#.*//g' | sed '/^$/d'
では
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) 00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
となってしまいます。
「^」の有無による動きの違いを抑えた上で利用する必要があります。
後段部分
sedコマンドによる削除、 '/対象/d'
を利用します。
ちなみにこの部分はcat -s
とする場合もあります。こちらは複数の改行を1つの改行にまとめて表示します。
要は前段部分によって
(空行) (空行) (空行) (空行) 00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
と空行になった部分を
(空行) 00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
と出すのか
00 5 * * * /root/hoge1.sh 05 22 * * * /root/hoge2.sh
と出すのかの違いです。
今回のファイルは空行が一か所にまとまっているのでsed '/^$/d'
を採用しましたが、コメント部分が随所に出てきてくるファイル等はcat -s
を用いて出力した方が適宜改行が挿入されていて見やすい場合もあります。
こちらもそれぞれの動きを把握した上で使い分けるのが肝要かと思います。
以上、コメント行を消す際のポイント解説でした。