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)と同じ