Linux/awk

Last-modified: 2015-04-09 (木) 02:39:11

AWK リファレンス

AWK とは?

AWK はフィルタリングによく使用されるコマンドであるが、同様にしてフィルタリングに使用される grep や cut と決定的に違うところは、 AWK 自体が独立した一つのスクリプト言語であるということだ。つまり、AWK は正確にはコマンドではなく、AWK スクリプト・インタプリタである。

例えばテキストから 1 フィールド目を抽出する場合には、「 awk '{ print $1 }' 」と実行するが、ここで引数として AWK に渡している「 { print $1 } 」の部分が AWK スクリプトのソースになっている。ちなみにこの「 { print $1 } 」は「全ての行に関して 1 フィールド目を標準出力に出力せよ」という意味になる。

この AWK は Perl などといった他のスクリプト言語ほど高機能ではないが、単一のテキストファイルや標準入力からのテキストをフィルタリング処理するには十分な機能を持っている。また、AWK をシェルスクリプトに組み込むことで、高度で高速なフィルタリング機能を備えたシェルスクリプトを作成することが可能になる。

シンプルな構文のスクリプト言語であるため、習得するにも Perl ほどコストはかからず、シェルスクリプトで少し高度なフィルタリング処理を書きたい人には打って付け言語である。

AWK の構文

パターンとアクション

AWK スクリプトは、パターンとアクションからなる単一もしくは複数ルールによって構成される。 AWK はテキストファイルもしくは標準入力からテキストを1行ずつ読み込み、各パターンとのマッチングを行う。パターンとのマッチングが成功した場合は、そのパターンに対応するアクションが実行されることになる。

awk '{ print $1 }'

この AWK スクリプトもシングルクォートに囲まれた部分がパターンとアクションになっている。ここではパターンの指定は省略されており、このようにパターンが省略された場合は、全行とマッチングが成功する。つまり、全ての行に対してアクションが実行されることになる。

上記の例の場合は「{ }」で囲まれた部分がアクションに該当し、「1フィールド目を出力する」という処理になっている。したがって、この AWK スクリプトは「全ての行の1フィールド目を出力する」という処理になる。

AWK スクリプトの基本的な構文は以下の通りだ。

pattern { action }

パターンとアクションの組を複数指定することも可能である。

pattern1 { action1 }
pattern2 { action2 }
pattern3 { action3 }

複数のパターンとアクションの組み合わせを指定した場合は、上から順にパターンが評価され、一致したパターンに対応するアクションが実行される。つまり、複数のパターンに一致した場合は、複数のアクションが実行されることになる。

パターン

アクションと対になるパターンには正規表現を使用することができる。比較対象が省略された場合は、現在読み込んでいる行と比較される。

/^AWK/ { print "この行は AWK ではじまる行です。" }

正規表現を使用する場合は必ず右側に指定すること。左側に指定するとエラーになる。文字列と正規表現とのマッチングには「~」を使用する。 $1 は現在読み込んでいる行の1フィールド目の値を表す AWK の組み込み変数である。

$1 ~ /^[A-Z][a-z0-9][a-z0-9]*$/ { print "正規表現は必ず右側に指定する。" }

パターンには正規表現などとのマッチング以外にも、一般的な数値の評価式なども指定することが可能である。 NR は AWK の組み込み変数で、現在読み込んでいる行の行数を表す。

NR == 10 { print "現在、10行目です。" }

AWK が現在読み込んでいる行とまったく関係ないパターンを指定することも可能。

count > 50 { print "変数countの値が50を超えました。" }

さらに、パターンは AND や OR で複数の条件を結合することもできる。

やっぱり、面倒
http://shellscript.sunone.me/awk.html
ここから。