久しぶりの勉強会ネタです。ここ最近いろんなつらみが重なって参加できてませんでしたが、「第10回記念シェル芸勉強会@シェルリアンタワー&第28回場所が未定だったが決まったぞ定例会 」にUSP友の会 スタッフとして参加してきました。しかも今回は日本UNIXユーザ会 の後援つきでございます。いつもはKDDI ウェブコミュニケーションズ 様に会場提供いただいていましたが、今回はGMOインターネット 様のご好意により、勝手にセルリアンタワーをシェルリアンタワー呼ばわりしての開催です。ありがとうございま.sh。
今回、上田さん曰く「いつもより簡単です」とのことでしたが、やっぱり参加者を殺しにかかってきています。(;´д`) 問題と回答はこちら になります。
全8問のシェル芸問題を解いています。皆さん真剣です。
シンガーソングライターみたいですが講師の上田先生です。
GMOインターネット様による、VPS「ConoHa」宣伝タイムです。3000円分のクーポンもいただいたので、いろいろ遊んでみようと思います。なお、このプレゼンはパワポではなくlessで実演しています!
6問目、hogeと書かれたファイルとhugeと書かれたファイルをそれぞれ別のディレクトリに振り分けるというエクストリームなシェル芸です。
みんな大好きxargs。
grep -o で縦に!
ConoHaたんマジConoHa!
当日の様子はこちらで振り返ることができます。
第10回記念シェル芸勉強会@シェルリアンタワー&第28回場所が未定だったが決まったぞ定例会 - Togetterまとめ
Ustream.tv (1)
Ustream.tv (2)
今回、2つ目から鱗だったのは「grep -o」の存在と、awkの「 awk '$1 != $2'」でした。(後者のawkは、USPマガジン Vol.12 でさいとうさんが触れています)
grep -o の使いドコロはこんな感じですね。
もう少し詳しくフォローしますと、grepのhelpでは「-o, --only-matching show only the part of a line matching PATTERN」と出てきます。つまり、パターンにマッチした箇所だけ出力してくれます。上田さんのブログにもサンプルがあります ので見てみるとよいですよ。つまり
[hamada@localhost ~]$ echo hoge | grep -o .
h
o
g
e
こうなります。Q2 のように「スペースと数字と改行を使って次のようなファイルを作り、書いた数を足し算してください」と言われても・・・
$ cat nums
1
2 3
4 5
6 7
8 9
一旦 grep -o を使って整形してやればできました。 grep -o マジ grep -o !
[hamada@localhost ~]$ expr $(cat nums | grep -o . | xargs | sed -e 's/ / + /g')
45
awk '$1 != $2' が生きたのはQ7 でした。「file1 file2」の行と「file2 file1」の行は重複とみなすという、そら恐ろしい条件で涙目になりましたが、さいとうさんのヒントでこんな解き方でできました。
[hamada@localhost ~]$ for i in $(seq 1 9); do for j in $(seq $i 9); do echo file$i file$j; done; done | awk '$1 != $2'
まだまだsh行が足りないですが、この2つを覚えただけでもかなり捗りそうです。次回、6月に大阪で、8月はOSCでシェル芸勉強会を開催する予定なので、みんなも来るといいよ!
最後におまけ。
[amazonjs asin="4904807065" locale="JP" title="USP MAGAZINE vol.12"]