2012年12月8日土曜日

シェル芸人への道


第2回シェル芸人養成勉強会に参加してきた。
hbsstudyハンズオンにも参加していたので、なんとなく雰囲気が掴めていて前回よりついていけたような気がする。 前回と同じく以下、自分の知らなかったことの(断片的な)まとめ。

パイプステータス

パイプを何個もつなげると、最後の終了ステータスしか分からないと思っていたが、
実はPIPESTATUSに最後のステータス以外も配列として格納されている。
% echo hoge | cat
hoge
% echo hoge | cat | cat | cat | cat
hoge
% echo ${PIPESTATUS[@]}
0 0 0 0 0
% echo hoge | cat | cat error | cat | cat
cat: error: No such file or directory
% echo ${PIPESTATUS[@]}
0 0 1 0 0

フィールドを指定したソート

-kn,m (nは開始フィールド、mは終了フィールド)オプションでソートに使用する基準を指定できる。
-kオプションを使うことは知っていたけど、このあたりの理解が曖昧になっていた。
% cat hoge
a 12
a 13
b 13
a 432
b 111
b 43
# フィールド1番目、2番目の順でそれらをキーとしてソート
% sort hoge | sort -k1,1 -k2,2nr
a 432
a 13
a 12
b 111
b 43
b 13

ランダムソート

要素をランダム(ハッシュに応じて)ソートする。
これはソートと言っていいのか?という疑問はある。
% seq 1 10 | sort -R
5
9
1
2
6
3
10
8
4
7

grep検索パターンをファイルから指定

-fオプションを使うことにより、検索するパターンをファイルから取得できる。これは便利。
% cat fuga
hoge
fuga
piyo
% cat fuga2
fuga
piyo
piyopiyo
# fuga2の内容をパターンとしてfugaからgrep
% grep -f fuga2 fuga
fuga
piyo

プロセス置換

これを一般的になんて表現したらいいのか分からないけど、以下のようにするとファイルに出力を意識することなく、ファイル出力されたものとして他のコマンドに結果を渡せる。
# 裏側ではファイル出力してるのやろうけど、使用者からは意識しなくて言いと言う意味
(ご指摘を受けたので修正)

以下のようにすると、プロセスの入出力をファイルのように取り扱うことができる(ファイルは出力していない)。
% cat hoge
a 12
a 13
b 13
a 432
b 111
b 43
% wc <(cat hoge)
      6      12      32 /dev/fd/63

どれも明日使える内容ばかりですね!!

しかしこれくらいで感心しているようでは、シェル芸人の道のりはまだまだ遠い。。