awkガナス

第5回 pattern, action の使い方

2015.08.05

今回は 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
}

著者プロフィール

naka

すきなコマンドは awk と bc です。なにかを計算する時、awk か bc を使います。

記事一覧Index