猿に文明を与えるな

個人的な勝手なまとめ。

AWK探訪

インフラ周りの作業が多くなるにつれて、シェルスクリプトを書く機会が増えてるので非業務時間にちょと触るかーというのでUSP MAGAZINEなるものを買ってみた。AWKとか普段は本当に簡単なことにしか使ってないし良い機会である。この投稿の内容は基本的にAWK処方箋を実際に動かしただけのものです。新しい発見を期待して読まないでください。

準備

Macなのでgawkを入れた

$ brew install gawk

AWKの真偽値

  • 偽: 数字の0、空文字列
  • 真: 上記以外
$ echo foo | gawk '0' # 0は偽なので出力なし

echo foo | gawk '""' # 空文字列は偽なので出力なし

$ echo foo | gawk '1' # 1は真なのでパイプされたfooがそのまま出力される
foo

$ echo foo | gawk '"0"' # "0"は文字列なので真。なのでfooが出力される
foo

比較

$ echo foo | gawk '0 == 0' # 0は偽だけど、0 == 0は真なのでfooが出力される
foo

$ echo foo | gawk '/foo/' # 正規表現fooに一致するのでfooが出力される
foo

代入

ここまでは分かってたんだけど、代入演算子は普段使っていないので発見だった。

正確には代入の戻り値が何か、だけど。

echo one two three | gawk '$2 = "bar"'
one bar three

echo one two three | gawk '$2 = ""' # 空文字列が戻り値になるので偽
(何も表示されず...)

後者の理由が、代入の戻り値は左辺値であるのは知らなかった。なので、もし表示させたい場合は次のように書けばよい。

echo one two three | gawk '!($2 = "")' # 戻り値の偽を反転させて真にする
one  three

echo one two three | gawk '$2 = ""; 1' # 強引かな...
one  three

書くの疲れたのであと1つだけ面白いなと思ったことを。

タブ or スペースだけの行を削除する。

$ echo -e "\n a b c \n \n d" | gawk 'NF' # NF(number of fields)が0の所は偽になるので出力されない
a b c 
d

最後のTIPSは覚えておこう