awk [-F 区ぎり記号] [-v awk変数=値] 'awkプログラム' [入力ファイル...] awk [-F 区ぎり記号] [-v awk変数=値] -f awkプログラム [入力ファイル...]
BEGIN{
[ アクション ]
}
[ /パターン/ ]{
[ アクション ]
}
END{
[ アクション ]
}
awk は入力ファイルから指示されたパターンに一致した行に対し、そこに記述された
種々の処理(アクションと呼びます)を行い、結果を標準出力に吐き出します。入力した行は、区切り記号で分割し、それらを $1〜n として参照できます。 $0 は分割していない入力行全てを顕し、区切り文字の省略値は「空白かタブ」です。
| 変数名 | 意味 |
|---|---|
| FILENAME | 処理中のファイル名 |
| NR | 処理中の行数 |
| FNR | 処理中の行数(ファイル毎の) |
| NF | 処理中の項目数($1..$NF,最大99) |
awk は常に処理対象となるファイルを読み込み、指定されたパターンを含む行を発見した時に予め指定された処理を行います。
よって awk プログラムの文法は以下のように、パターンとアクションの組合せになります。
パターン { アクション }
function 関数(引数..) { 文 } ... これに付いては後述
パターンには正規表現を用ることができますし、特別なパターンとしてBEGIN、ENDがあります。
BEGIN{ ファイルオープン時に行う処理 }
/^#/{ 先頭がシャープで始まる行に付いての処理 }
END{ ファイル終了時に行う処理 }
awk プログラムは3種類の記述方法があります。
$ awk 'BEGIN{print "length\tdata\n------\t----"}{print length($0),"\t",$0}' /etc/hosts
length data
------ ----
25 127.0.0.1 localhost
41 192.168.80.36 server36.abc.ne.jp server36
例) (1)と同じプログラムを別ファイルとして予め作成し、実行する
$ cat test.awk
BEGIN{
print "length\tdata"
print "------\t----"
}
{
print length($0),"\t",$0
}
$ awk -f test.awk /etc/hosts
# 実行結果は(1)と同じ
例) (2)と同じプログラムに起動オプションを付加
$ cat test.awk
#! /bin/gawk -f
BEGIN{
print "length\tdata"
print "------\t----"
}
{
print length($0),"\t",$0
}
$ test.awk /etc/hosts
# 実行結果は(1)と同じ