awkは、スクリプト型言語の1種であり、その機能はとても豊富です。sedと同じくシェルスクリプトの中で使われるケースが多いです。awkを使って何ができるのかについては、サンプルを交えながら見ていきます。

以下は、パターンに一致した行にコマンドを実行するサンプルです。

awk '
/abc/ { print "ABC"; }
'

awkは、標準入力から入力された行がパターンに一致した場合に、その行に対してコマンドを実行します。(一致したパターン部分に対してではありません。)一致しなければ何もしません。

awkの基本形
awk ‘
/パターン/ { コマンド; }

上記サンプルは、パターンとしてabcとしています。つまり、入力行にabcを含んでいる場合には、パターンに一致するため、コマンドを実行します。入力行にabcを含まない場合は、パターンに一致しないため何もしません。

printコマンドは標準出力に指定した文字列を出力するコマンドです。

実際に、上記awkを実行してみます。

awk '
/abc/ { print "ABC"; }
'

ここまで入力すると、入力モードに切り替わります。

実行結果 abcと入力した場合

ABC

実行結果 aaaと入力した場合
何も表示されない。

awkを終了したい場合は、Ctrl+dと入力します。

複数のパターンを使う

/パターン/ { コマンド; }は複数書くことができます。入力行は、すべてのパターンと比較され、一致すればそれぞれコマンドを実行します。

/パターン/の部分には、以下のようなパターンを書くことができます。

主なパターン 説明
/拡張正規表現/ 入力行が拡張正規表現に合致すればコマンドを実行する
(式) 式が真ならばコマンドを実行する(awkでは0が偽、0以外が真)
BEGIN 入力前に、無条件にコマンドを実行する
END 入力後に、無条件にコマンドを実行する
パターンなし 無条件にコマンドを実行する

では、これらを踏まえもうひとつサンプルを示します。

awk '
BEGIN { print "Hello"; }
{ print $1; }
($1>10) { print "10 greater than"; }
($1<3)  { print "3 less than"; }
END   { print "Bye"; }
'

パターンとコマンドをひとつずつ見ていきます。

パターン 説明
BEGIN { print "Hello"; } データの入力前に必ず実行されます。この例では、Helloと表示します
{ print $1; } パターンがないので、どの入力行に対しても実行されます。第1変数($1)を表示します
($1>10) { print "10 greater then"; } パターンが式です。この例では、第1変数が10より大きければ実行されます
($1<3) { print "3 less then"; } パターンが式です。この例では、第1変数が3より小さければ実行されます
END { print "End"; } データ入力後に必ず実行されます。この例では、Byeと表示します。

上表の中に第1変数($1)とありますが、これは、入力行を単語に分割した最初の単語を示します。他にもawkでは以下の変数が定義されています。

変数 説明
$0 入力行全体
$1 入力行を単語に分割した最初の単語
$2 入力行の2番目の単語。以下、$3以降も同様

実行結果

Hello  ← 入力前に表示される
1      ← 入力
1      ← どの入力行に対しても表示される
3 less than ← 3より小さいため、左記のように表示される
11      ← 入力
11      ← どの入力行に対しても表示される
10 greater than ← 10より大きいため、左記のように表示される