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より大きいため、左記のように表示される