まずは以下行をご覧ください。サーバのcrontabのとある1行です。
00,10,20,30,40,50 * * * * sh /home/hoge/foo.sh clean all > /dev/null 2>&1
これを以下のようにCSVデータ化したいです。
sh /home/hoge/foo.sh clean all > /dev/null 2>&1,"00,10,20,30,40,50:*","* * *"
で、これをawkでやろうとしたところ、
$ cat crontab | awk 'BEGIN{OFS=","} {print $6,$7,$8,$9,$10,$2":"$1,$3,$4,$5}'
sh,/home/hoge/foo.sh,clean,all,>,*:00,10,20,30,40,50,*,*,*
と、スクリプト指定のところはオプションまでカンマ区切りになってしまい、また10分おきに動かしているためのカンマ指定とごっちゃになってしまい、
$ cat crontab | awk 'BEGIN{OFS=","} {print $6,$7,$8,$9,$10,$2":"$1,"$3,$4,$5"}'
sh,/home/hoge/foo.sh,clean,all,>,*:00,10,20,30,40,50,$3,$4,$5
…とまぁこんな感じになってしまい上手くいきません。
awkについてはほとんど知識、コーディングしたことがないため、詰まってしまっています。
ちなみにawk縛りと言うのはありません。perlやsedでも、出来るなら手段は問わないです。
よろしくお願いいたします。
awk でやると、こんな感じでしょうか。
#! /usr/bin/sh -f crontab -l | awk ' { t = "\"" $1 ":" $2 "\"" d = "\"" $3 " " $4 " " $5 "\"" $1 = $2 = $3 = $4 = $5 = "" sub(/^ /, "") print $0 "," t "," d } '
時分の順番が、質問文では二種類書いてあったので、crontab に合わせて分→時としてあります。
ワンライナーでも書けますが、ちょっと苦しい感じですかね。
$0 == $1 IFS $2 IFS $3 IFS $4 ...
という関係が、常に成り立ってます。
まず、いくつ空白が入ってるかわからない crontab のコマンドの内容を取得するためには、個数が決まっている時刻指定のところを消しちゃえば良いじゃん、ってところから入りました。
$1 = $2 = $3 = $4 = $5 = ""
が、時刻指定の最初の五つの項目を消してます。
五個目までを空文字列にすると、$0 は、その内容を反映して
$0 == " sh /home/hoge/foo.sh clean all > /dev/null 2>&1"
となってます。
空文字列五個を、OFS の空白が結合しているので、先頭に、欲しくない空白五つが付いた状態になってます。
その行頭の空白五つを切り取るのが、以下の行です。
sub(/^ /, "")
これで、コマンドの表現は手に入りました。
後は、消してしまった時刻を表す表現を、前もって別の変数に入れておくだけです。
まだ、他に聞きたいことがあれば、何なりと。
分かる範囲で答えます。
ありがとうございます。とても参考になります。
2012/08/28 18:52:09ちょっとawkから離れるかもですが、更に教えてください。
for文で定義された変数が表示されず、困っております。例えば、
for FILE in `ls /var/spool/cron`
do
echo USER=${FILE}
cat /var/spool/cron/$FILE | awk '{print $1 "," '${FILE}'}'
done
と言う文を作成し、実行しました。
その結果、本来$FILEで定義された(例えばrootとか)が表示されるはずが表示されません。
> USER=root
> */5,
という感じでawkにfor文で定義された変数$FILEが反映されません。
for文の前に定義された変数についてはどうも認識するようなのですが…。
シェル変数?とは呼ばないかも知れませんが、echoでは表示されるため、一見有効そうに思われるのですが…。
試してないので想像で書いてます。
シェル変数が展開された後は、こうなってます。
awk は、root という文字列ではなく、root という変数を print しているのだと思います。
cat ~ の行を、以下のようにしてみてください。
分かりにくいかもしれませんが、${FILE} を挟んでいるシングルクォートの前後にダブルクォートを入れてます。
2012/08/28 21:17:48シェル変数が展開された後に、以下のような感じに展開されるイメージです。