読者です 読者をやめる 読者になる 読者になる

第10回記念シェル芸勉強会@シェルリアンタワー&第28回場所が未定だったが決まったぞ定例会に行ってきました

行ってきました

4月5日にGMO Yoursで開催された、第10回記念シェル芸勉強会@シェルリアンタワー&第28回場所が未定だったが決まったぞ定例会に行ってきました。

なお、今回は会場がGMOインターネット株式会社様ということで、VPSConoHa」の3000円クーポンもいただきました。 せっかくなのでいろいろ遊んでみようと思います。

f:id:ser1zw:20140407030208j:plain

気合の入ったクーポン券。デザイナーさんが超頑張ったとのこと。

今回学んだシェル芸

grep -o で1列に並べよう

通常、grepはマッチする行全体を出力しますが、-o(--only-matching)オプションを使用することで 行全体ではなくマッチする部分のみを出力します。

$ grep --help
  …
Output control:
  …
  -o, --only-matching       show only the part of a line matching PATTERN

これをQ4

次のようなファイルを作り、ファイルの中に三個存在する文字を出力してください。

ueda@remote:~$ cat hoge

aabbcdabbcccdd

で使うと、

$ echo aabbcdabbcccdd | grep -o .
a
a
b
b
c
d
a
b
b
c
c
c
d
d

のように出力できるので、あとはsortしてuniqしてgrepすればOK、というわけでした。

$ echo aabbcdabbcccdd | grep -o . | sort | uniq -c | grep 3
      3 a
      3 d

シェル芸では処理対象を「1行に1つ」の形に持っていくと処理しやすいことが多いので、こいつは大変便利です。

xargs で1行に並べよう

xargs といえば標準入力を読み込んで他のコマンドに引数として渡して実行するコマンドですが、 コマンドを指定しない場合はデフォルトの /bin/echo が実行されるため、結果として標準入力で 与えられたものを1行に並べるという動きをします。

xargs は、標準入力から空白や改行で区切られた一連の項目を読み込み (空白はダブルクォート、シングルクォート、バックスラッシュによって 保護できる)、それを引き数にして、指定した command を実行する (デフォルトのコマンドは /bin/echo である)。 このとき、ユーザが command に対して指定した引き数 (上記書式の initial-arguments) があれば、 xargs は標準入力から読み込んだ一連の項目をその後ろに 追加していく http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html

問題のQ2

スペースと数字と改行を使って次のようなファイルを作り、書いた数を足し算してください。

$ cat nums
    1
 
2 3       
     4       5
    6    7
 
8      9

では前述の grep -o で数値を1列に並べてawkで足し算、というのもアリですが、xargs を使って 数式を組み立てて bc に放り込むと変態度が上がります。

上記のファイルをそのまま xargs に渡すと

$ cat nums | xargs
1 2 3 4 5 6 7 8 9

となるので、あとは tr コマンドでスペースを + に置換して数式にしておき、

$ cat nums | xargs | tr ' ' '+'
1+2+3+4+5+6+7+8+9

bc コマンドに渡せばOK、というわけです。

$ cat nums | xargs | tr ' ' '+' | bc
45

このはちゃんはtcsh使い

こわいよー。

まとめ

というわけで、シェル芸勉強会に参加してきました。 grep や xargs のようなよく使うコマンドも、掘り下げると知らない使い方が 見つかるもんですね。