awkでマッチした行にのみアクションを実行する。

遅いですが、あけおめことより。


すごく今さらなんですが、awkの使い方を知りました。
perlの onelinerに -aオプションをつけりゃいいじゃんとしか
思っていなかったんですが、サクっと手短に済ませたいときは
awkでいいかなって思った。


今まで $1, $2を表示するだけのツールかと思っていたんですが、
マッチする行の指定ができるんですね。全部の行のいずれかの
フィールドを表示するという使い方が圧倒的に多いから、
特定の行のみを対象ということがあまりないんでしょう。


マッチさせる方法は簡単で、アクションの前に正規表現を書くだけ。
'||', '&&'で複雑なマッチ条件も書けます。否定のときは '!'をつけます。


/etc/passwdからシェルが '/bin/sh'じゃない、ユーザ名を抜き出すと
いうのを以下に示します。

% awk -F : '!/bin\/sh/ {print $1}' /etc/passwd
root
sync
syslog
klog
landscape
sshd
messagebus
syohei
gitlog
gitdaemon
mysql

Perlの onelineよりかは若干短くなると思います。
マッチした部分を抜き出すって場合は Perlを使った方がすっきりと
書けそうですけど、単純にフィールドを抜き出すってだけなら
awkの方が短く書けそうですね。