二度と忘れないawkコマンドの基本
結論としては、これだけ。
awkはテキストの各行に対して pattern { action } を実行する。
これだけ覚えれば間違えずに使える。
awk コマンドはテキスト整形に便利だが、使い方をよく忘れるのでいつもググっている。
使い勝手が悪いわけではないけど、多機能ゆえに使いこなすのが難しい気がする。
awkコマンドの簡単な使用例
こんな csv ファイルがあるとして、
$ cat user.csv id,name,age 1,佐藤,19 2,伊藤,20 3,加藤,21
idの列だけを表示したいとする。そのための awk コマンドは、以下のようになる。
$ cat user.csv | awk -F ',' '{print $1}'
id
1
2
3
はい。オプション -F ',' でセパレータを指定しているのは良いとして、 '{print $1}' がなんか気持ち悪い。中括弧、誰やねんお前どこから来たんや。
awk は実はただのコマンドラインツールではなくチューリング完全なスクリプト言語なので、文法が存在する。
シングルクォートで囲まれた {print $1} の部分は、awk のスクリプトを書いているというわけ。だから中括弧 {} とかが出てくる。
文法は後回しにして、上記のコマンドの $1 を書き換えると、だいたい予想通りの動きをする。
$ cat user.csv | awk -F ',' '{print $0}'
id,name,age
1,佐藤,19
2,伊藤,20
3,加藤,21
$ cat user.csv | awk -F ',' '{print $2}'
name
佐藤
伊藤
加藤
awkコマンドの引数に中括弧が必要な理由
覚えるべき文法は一つ。
awkはテキストの各行に対して pattern { action } を実行する。
pattern にマッチする行に action を実行するということだ。実用上はこれだけ覚えておけば十分だと思う。
先程の {print $1} の意味もこれでわかる。 pattern が省略されているため、すべての行にprint $1 を実行する。つまり、セパレートされた一つ目の文字列を標準出力に出すということだ。
pattern には正規表現や条件式が使える。
いろいろな例
- 2行目以降を出力する
変数 NR は現在の行番号。
cat user.csv | awk -F ',' 'NR > 1 {print $0}'
1,佐藤,19
2,伊藤,20
3,加藤,21
- 年齢(3番目のフィールド)が20以上の行のidを出力する
$ cat user.csv | awk -F ',' '$3 >= 20 {print $1}'
id
2
3
- 名前に文字
藤を含む行を出力する
$ cat user.csv | awk -F ',' '$2 ~ /藤/ {print $0}'
1,佐藤,19
2,伊藤,20
3,加藤,21