ホームページをリニューアルしました。旧HPはこちら
ソフト・ハードウェア

AWK 複数ファイルへの出力(リダイレクト機能)

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

コメント

タイトルとURLをコピーしました