AWKでArchiveデータを月日単位のファイルに切り分けたい
参考URL:http://www.soum.co.jp/misc/naka/awk/6.html
10行ごとにファイル出力
出力ファイル名を変数に定義して10行ごとにファイル出力する例。
% awk '{
if( NR%10 == 1 ){
close(out) # 直前まで出力していたファイル
out = sprintf("aa%03d", NR/10)
}
print > out # 変数out に定義したファイル名に出力
}' file
以下のファイル名でファイルが作成される。
% ls aa*
aa000 aa001 aa002 aa003 aa004
時間毎にファイル出力
% awk -F: ' { # 区切りを ':' にする
close(out) # ファイルオープンの数に限りがあるので都度close
out = $1 # $1 == Apy 16 10
gsub(/ /, "_", out) #スペースをアンダーバーに置き換え
print >> out
}' /var/log/syslog
% ls -l Apr*
-rw-r--r-- 1 naka member 843 4月 16 16:59 Apr_16_10
-rw-r--r-- 1 naka member 393 4月 16 16:59 Apr_16_11
ファイル名引数として、値を渡す。
awkコマンドのスクリプトの直後に、awkで用いる変数varと代入する値value(もしくはシェル変数)を記述すれば良い。
$ awk 'script' var=value file
以下に具体例を示す。
$ cat file
man co
$ awk 'BEGIN{print num} END{print num}' num=100 file
100
シェルスクリプトの書き方
最初の例は、引数をチェックして取り込む基本的なシェルスクリプトである。
ファイル名:basic.sh
#!/bin/sh
#
#--- 引数のチェック
### $#はコマンドラインに続く文字列の数。
### もし引数の個数が一つでなければ、usageを標準エラー出力に出して終了
if [ $# != 1 ]; then
echo "usage: $0 strings" 1>&2
exit 0
fi
#--- 変数ARGV1に第一引数を代入
ARGV1=$1
#--- ARGV1を画面に(標準出力に)出す
echo $ARGV1
入力した文字列をそのまま返している。 if文内では引数の解析を行い、引数の個数が一つであるとき以外は使用法を表示して終了する。 次に、変数ARGV1に引数を代入し、echo文でARGV1を出力している。以下が実行例である。
% basic.sh aaa
aaa