今回は pattern, action について書きます。
awk は pattern, action で構成されます。pattern, action はいくつ記述してもよいです。
pattern {action}
pattern {action}
...
- pattern は条件などを記述します。
- action は print 文などを計算を記述します。
pattern の書き方の例¶
/abc/ abcの文字列がある行
/Sep/ && /09/ Sep と 09 の両方の文字列がある行
/Desk/,/Drop/ 文字列Deskがある行から文字列Dropのある行まで
$1 == "2014" $1が2014の行
$6 == "Oct" && $7 == 6 $6がOct,$7が6の行
$1 ~ /2014/ $1に2014が含まれている行
$1 !~ /2014/ $1に2014が含まれていない行
patternか、action どちらかだけを記述すればよい¶
awk は、pattern か action どちらかが記述されていればよいというルールになっています。
pattern または、{action}
action は必須と思いがちですが、awk の仕様では pattern, action のどちらかが記述されていれば OK です。
patternがtrueの時その行が表示される¶
pattern が true になった時、その行が表示されますので pattern に /bz/ と記述した場合は grep bz と同じ動作になります。
% ls -l /bin/ | awk /bz/
-rwxr-xr-x 3 root root 30240 10月 21 2013 bzcat
lrwxrwxrwx 1 root root 6 10月 21 2013 bzcmp -> bzdiff
-rwxr-xr-x 1 root root 2140 10月 21 2013 bzdiff
フィールドを指定してパターンマッチ¶
フィールドを指定してパターンマッチできるのでgrepより細かい指定ができます。
例)ファイル名に ‘ro’が含まれる行を表示したい場合、
ファイル名($9フィールド)を指定すれば、$4フィールドの”root”に影響されることがない。
% ls -l /bin/ | awk '$9 ~ /ro/'
-rwxr-xr-x 1 root root 9628 12月 19 2013 ntfs-3g.probe
patternに1を指定¶
あまり、使い道がないと思いますが、pattern に 1 を指定すると常に true なので cat と同じ動作になります。
% ls -l /bin/ | awk 1
合計 9496
-rwxr-xr-x 1 root root 986672 9月 27 2014 bash
-rwxr-xr-x 3 root root 30240 10月 21 2013 bunzip2
..
pattern と action の間に改行すると動作が異なる¶
ファイルにスクリプトを記述する場合、見やすさのために改行を入れる場合があります。
% cat test.awk
$1~/^-rwx/{ print $1,$9 }
可読性のため、/^-rwx/のあとに改行を入れてみます。
% cat test.awk
$1~/^-rwx/
{
print $1,$9
}
改行をいれた場合の実行結果は以下になり、改行を入れる前の表示と異なっています。
- 改行を入れる前の実行結果
% ls -l /bin/ | awk -f test.awk
-rwxr-xr-x bash
-rwxr-xr-x bunzip2
-rwxr-xr-x busybox
-rwxr-xr-x bzcat
- 改行を入れた後の実行結果
% ls -l /bin/ | awk -f test.awk
合計
-rwxr-xr-x 1 root root 986672 9月 27 2014 bash
-rwxr-xr-x bash
-rwxr-xr-x 3 root root 30240 10月 21 2013 bunzip2
-rwxr-xr-x bunzip2
改行を入れた後の実行結果は以下の処理が別々に実行されています。
- $1~/^-rwx/ の処理
- {print $1,$9}の処理
これは pattern と action に改行を入れたので別の処理になったためです。
- $1~/^-rwx/ の処理結果
-rwxr-xr-x 1 root root 986672 9月 27 2014 bash
-rwxr-xr-x 3 root root 30240 10月 21 2013 bunzip2
- {print $1,$9} の処理結果
合計
-rwxr-xr-x bash
-rwxr-xr-x bunzip2
pattern のあとに ‘{‘ があれば、同一の処理になるので改行を入れる場合は以下のように記述します。
% cat test.awk
$1 ~ /^-rwx/ {
print $1,$9
}