まくまくsed/awkノート
awk の基本的な使い方
2007-12-17

awk について

awk という名前は、作者の頭文字に由来しています (Aho, Weinberger, Kernighan)。 特定のフォーマットのテキストファイルを一括して処理するのに適した言語です。 sed と同じくストリーム指向で、テキストファイルを 1 行ずつ読み、結果を標準出力へ書き出すという動作をします。

sed と awk の違い

sed と awk の違いは、sed では s/aaa/bbb/ のように決まった形式で置換処理を記述するのに対し、awk は簡単なプログラミング(手続き)機能を提供しているところです。 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
2007-12-17