awk という名前は、作者の頭文字に由来しています (Aho, Weinberger, Kernighan)。 特定のフォーマットのテキストファイルを一括して処理するのに適した言語です。 sed と同じくストリーム指向で、テキストファイルを 1 行ずつ読み、結果を標準出力へ書き出すという動作をします。
sed と awk の違いは、sed では s/aaa/bbb/
のように決まった形式で置換処理を記述するのに対し、awk は簡単なプログラミング(手続き)機能を提供しているところです。
awk では、処理対象となる行を指定するための /パターン/ と、処理内容を指定するための {手続き} を分けて指定できるようになっています。
プログラミング機能を本格的に使用する場合は、長いスクリプトを記述することになるので、awk スクリプトとしてファイルに保存することになります。
$ awk '{print $1}' input.txt # 1 番目のフィールドを出力
上記のように、命令部分に print
のような「手続き」だけを指定した場合は、すべての行に対してその手続きが適用されます。
この例では、input.txt
ファイル内のすべての行から 1 番目のフィールドを抜き出します(デフォルトのセパレータは、スペースやタブです)。
ちなみに、Linux の cut
コマンドを使った場合も、同様のこと(指定した位置のフィールドを抜き出す)を行えます。
$ cut -d ' ' -f 1 input.txt # 1 番目のフィールドを出力
$ awk '/ABC/ {print $3}' input.txt
上記のようにすると、ABC
という文字列を含む行の、3 番目のフィールドをすべて出力します。
$ awk '/AAA/,/BBB/ {print}' input.txt
上記のようにすると、AAA
という文字列を含む行から、BBB
という文字列を含む行までを出力します。
この例からも分かるように、print
のパラメータを省略すると、行全体を出力します(パラメータ $0
を指定しても同様)。
さらに、このように出力だけを目的として実行する場合は、print
命令自体を省略できます。
$ awk '/AAA/,/BBB/' input.txt
awk スクリプトが長くなってきた場合は、スクリプトファイルとして保存しておくと便利です。
下記の例では sample.awk
という awk スクリプトファイルを実行しています。
$ awk -f sample.awk input.txt