20130223 osc tokyo/spring
DESCRIPTION
オープンソースカンファレンス 2013 Tokyo/Spring での講演。研究所名義だけどほとんど友の会の内容。ビジネス版コマンドを少し使用。TRANSCRIPT
覚えて楽するシェル一行野郎10選! 魅せます☆華麗なシェル芸!
USP研究所 上田隆一
シェル芸とは?
• 「マウスも使わず、ソースコードも残さず、 GUIツールを立ち上げる間もなく、 あらゆる調査・計算・テキスト処理を コマンド入力一撃で終わらす。」こと
– 昨年10月のHbstudy#38で初めて使った言葉 – 現在は Windows PowerShell まで飛び火 • 密かなブームか?
2013/02/23 OSC 2013 Tokyo/Spring 2
シェル芸勉強会
• 3時間で10問、ワンライナーの問題を解く • 例題: – 文字数を数えてください。
– 答え: • $ cat aiueo | tr -‐d '\n' | wc –m など多数
2013/02/23 OSC 2013 Tokyo/Spring 3
「シェル芸」の狙い
• USP研究所のやっていることを理解してもらう – 端末叩いたことの無い人には全く理解されない
• バイアスの是正 – いまさら「シェルが便利」などと言うエバンジェリストはいない – とても便利なのだが、普通は興味の範囲内にならない
• 若い人は使ってない。 • 知らない人を見ていると、 1 + 1 を計算するのに
群論を持ち出しているように見える。
2013/02/23 OSC 2013 Tokyo/Spring 4
「シェル芸」の狙い(続き)
• スキルトランスファー – 「シェル芸勉強会」参加者 • 講師
– 問題と解答を作る(解答はだいたい不完全で、別解が存在)
• 玄人 – 経験・うんちく多し、マニアックで便利なオプションを知っている、
勉強会荒らし。ただしパズルを出すと解けないことが多い
• 玄人ではない人
2013/02/23 OSC 2013 Tokyo/Spring 5
玄人 v.s. 講師の(平和な)突っ込み合戦を聴き、 全員が勉強する。
これまで • 2012/10/27 – シェルスクリプトでいろいろやってみよう(Hbstudy#38 )
• 2012/12/8 – 第二回チキチキ シェル芸人養成勉強会
• 2013/2/16 – 第三回シェル芸爆破デスマッチ – sed の問題を中心に
• これからも需要がある限り2ヶ月に1回開催予定 – 4/13(土)予定
2013/02/23 OSC 2013 Tokyo/Spring 6
今日の内容
• 個人的に面白い/役に立つシェル芸10個を紹介
• せっかくUSP研究所名義で発表するので、 いくつかはビジネス版で拡張シェル芸をお魅せします。 (大風呂敷)
2013/02/23 OSC 2013 Tokyo/Spring 7
1. FizzBuzz(準備運動)
• こういう出力を得る – 1,2,Fizz,4,Buzz,Fizz,7,8,Buzz,Buzz,11,Fizz,13,14,FizzBuzz,16,…
• 短く書くこと。
2013/02/23 OSC 2013 Tokyo/Spring 8
解答
• $ seq 1 16 | awk '$1%3==0{prin] "Fizz"}$1%5==0{prin] "Buzz"}{print " ",$1}' | awk '{print $1}' | tr '\n' ','
2013/02/23 OSC 2013 Tokyo/Spring 9
2. 数を数える
• テキストファイル(原稿)から 「Ubuntu」の文字を数える
2013/02/23 OSC 2013 Tokyo/Spring 10
解答
• $ grep Ubuntu *.rst | sed 's/:.*//' | sort | uniq -‐c
2013/02/23 OSC 2013 Tokyo/Spring 11
3. データ抽出
• キー a, b それぞれについて、一番大きい数字を取り出してください。
2013/02/23 OSC 2013 Tokyo/Spring 12
解答
• $ cat hoge | sort -‐k1,1 -‐k2,2nr | uniq -‐w 1 (Mac 等だと guniq を使う)
2013/02/23 OSC 2013 Tokyo/Spring 13
4. 日付の計算
• 1978年2月16日は、 2013年2月23日の何日前でしょう?
2013/02/23 OSC 2013 Tokyo/Spring 14
解答
• Mac – $ echo $(gdate +%s -‐d 20130223) $(gdate +%s -‐d 19780216) | awk '{print $1-‐$2}' | awk '{print $1/(24*60*60)}'
(gdate インストールのこと)
• Linux等 – echo 19780216 20130223 | tr ' ' '¥n' | date +%s –f -‐ | tr '¥n' ' ' | awk '{print $1-‐$2}' | awk '{print $1/(24*60*60)}'
2013/02/23 OSC 2013 Tokyo/Spring 15
5. リストにないものを探す
• 1から10までの数字のうち、numにないものは?
2013/02/23 OSC 2013 Tokyo/Spring 16
解答
• $ seq 1 10 | cat -‐ num | sort | uniq –u • $ sort num <(seq 1 10) | uniq -‐u
2013/02/23 OSC 2013 Tokyo/Spring 17
6. エクセルの読み書き
• ビジネス版 – 読み • $ rexcelx 1 book.xlsx
– 書き • $ echo {1..10} | wexcelx ./book.xlsx 1 A7 -‐ > out.xlsx
2013/02/23 OSC 2013 Tokyo/Spring 18
7. 速いソート
• 1億行のデータのソート
2013/02/23 OSC 2013 Tokyo/Spring 19
解答(というよりベンチマーク)
2013/02/23 OSC 2013 Tokyo/Spring 20
8. ソートして集計
2013/02/23 OSC 2013 Tokyo/Spring 21
9. 足し算する(精度よく)
• 答え:212702.890832364364363
2013/02/23 OSC 2013 Tokyo/Spring 22
解答
• $ cat num | sed 's/$/ + /' | tr -‐d '\n' | awk '{print}' | sed 's/+ -‐/+ /g' | sed 's/+ $//' | bc
• $ sm2 0 0 1 1 num
2013/02/23 OSC 2013 Tokyo/Spring 23
10. 横に並んだ数字のソート
• 各行について、数字を小さい方から横に並べる。
2013/02/23 OSC 2013 Tokyo/Spring 24
解答
• $ cat file | cat -‐n | awk '{for(i=2;i<=NF;i++) {print $1,$i}}' | sort -‐k1,1n -‐k2,2n | awk '{if($1!=a){a=$1;prin] "n"};print $2}' | tr '\n' ' ' | tr 'n' '\n' | awk 'NF!=0'
• $ cat file | juni | tarr num=1 | sort -‐k1,1n -‐k2,2n | yarr num=1 | delf 1
2013/02/23 OSC 2013 Tokyo/Spring 25
まとめ
• 端末は(シェル芸で修行すれば)便利 • 4/13(予定)遊びに来てください
2013/02/23 OSC 2013 Tokyo/Spring 26