2015年12月28日月曜日

第20回シェル芸勉強会でびっくりしたことまとめ

第20回シェル芸勉強会に参加しました。幾つか初めて知って(過去に見たことがあるかもしれないけど)びっくりしたことがあったので備忘録としてまとめてみた。基本的に午前中で燃焼したので午後のことは書いていない。manを読むべきということを再確認した。そもそもGNUの指針だとmanにいっぱい書いてあるのは良くないはずじゃなかったっけ、とか言う話は知らない。(本当はinfoに書くべき(?))

AWKのPattern Ranges

とりあえずman抜粋

A pattern range consists of two expressions separated by a comma; in this case, the action shall be performed for all records between a match of the first expression and the following match of the second expression, inclusive. At this point, the pattern range can be repeated starting at input records subsequent to the end of the matched range.
見たことあるかもしれないけど、知らなかった。というかパターンのとこにカンマをカンマ演算子のつもりで書いてうまくいかなかったことがあったかも。 つまり

awk 'NR==2,NR==4'

sed -ne '2,4 p'
と同じ意味になるらしい。ついでに言うと

awk 'NR==2,0'

sed -ne '2,$ p'
と同じ意味で使うらしい。

nawkとそれ以外の$0代入の挙動が微妙に違う

これはやばいやつ。MacOSXだとawkがnawkらしいので結構重要かも。

具体的には(i > 1)で


awk '$0=$i'
の挙動が怪しい。gawkとmawkでは全体の真偽値が$iの真偽値と一致すると思って良いがnawkではそうでもないらしい。manを読んでもよくわからなかったので適当にコードを実行して調べた。本を読むと良いのかも。少なくとも調べた限りでは$iの中身がstringの場合には思った通りの挙動をするが、numericの場合には常に偽を返すっぽく見える。

もちろん


nawk '$0=$i'

nawk '($0=$i)||($0)'
の結果は変わらないのだが、(numericだと偽)

nawk '($0=$2)||(($1=$1)&&$0)'
ということにして一回フィールドを書き換えると$0の真偽値が想定しているものに変わる。因みに$0の値はprintして見る限りでは特に変なことになっていない。この挙動が意図したものなのかバグなのかはよくわからないが、少なくともMacOSXでドヤ顔して$0への代入をすると冷や汗をかくことになりそう。

seqと{..}

seq 100 1はだめだけどecho {100..1}が動くの知らなかった。{1..10..2}ができることも知らなかった。

因みに{foo,bar}で色々やる話は知っているけど技術的に使えないやつなのでとりあえず置いておく。${foo:ここ色々}系列も見たことあるし使ったこともある(manを見ないと半分くらい使えない)から今回は置いておく。

午後も自分じゃない端末ってどうやって判別するのかとかよくわかっていない点はあった(今もちゃんとやるにはどうすればいいかよくわかっていない)が、サーバエンジニアじゃないしな、って言って忘却の彼方に投げやった。

0 件のコメント:

コメントを投稿