26
覚えて楽するシェル一行野郎10選! 魅せます☆華麗なシェル芸! USP研究所 上田隆一

20130223 OSC Tokyo/Spring

Embed Size (px)

DESCRIPTION

オープンソースカンファレンス 2013 Tokyo/Spring での講演。研究所名義だけどほとんど友の会の内容。ビジネス版コマンドを少し使用。

Citation preview

Page 1: 20130223 OSC Tokyo/Spring

覚えて楽するシェル一行野郎10選!  魅せます☆華麗なシェル芸!

USP研究所 上田隆一

Page 2: 20130223 OSC Tokyo/Spring

シェル芸とは?

•  「マウスも使わず、ソースコードも残さず、  GUIツールを立ち上げる間もなく、  あらゆる調査・計算・テキスト処理を  コマンド入力一撃で終わらす。」こと  

– 昨年10月のHbstudy#38で初めて使った言葉  – 現在は  Windows  PowerShell  まで飛び火  •  密かなブームか?

2013/02/23 OSC  2013  Tokyo/Spring 2

Page 3: 20130223 OSC Tokyo/Spring

シェル芸勉強会

•  3時間で10問、ワンライナーの問題を解く  •  例題:    – 文字数を数えてください。  

– 答え:  •  $  cat  aiueo  |  tr  -­‐d  '\n'  |  wc  –m  など多数  

2013/02/23 OSC  2013  Tokyo/Spring 3

Page 4: 20130223 OSC Tokyo/Spring

「シェル芸」の狙い

•  USP研究所のやっていることを理解してもらう  –  端末叩いたことの無い人には全く理解されない    

•  バイアスの是正  –  いまさら「シェルが便利」などと言うエバンジェリストはいない  –  とても便利なのだが、普通は興味の範囲内にならない  

•  若い人は使ってない。  •  知らない人を見ていると、  1  +  1  を計算するのに  

群論を持ち出しているように見える。  

2013/02/23 OSC  2013  Tokyo/Spring 4

Page 5: 20130223 OSC Tokyo/Spring

「シェル芸」の狙い(続き)

•  スキルトランスファー  – 「シェル芸勉強会」参加者  •  講師  

– 問題と解答を作る(解答はだいたい不完全で、別解が存在)  

•  玄人  – 経験・うんちく多し、マニアックで便利なオプションを知っている、

勉強会荒らし。ただしパズルを出すと解けないことが多い

•  玄人ではない人

2013/02/23 OSC  2013  Tokyo/Spring 5

玄人 v.s.  講師の(平和な)突っ込み合戦を聴き、  全員が勉強する。

Page 6: 20130223 OSC Tokyo/Spring

これまで •  2012/10/27  –  シェルスクリプトでいろいろやってみよう(Hbstudy#38  )  

•  2012/12/8  –  第二回チキチキ シェル芸人養成勉強会  

•  2013/2/16  –  第三回シェル芸爆破デスマッチ  –  sed  の問題を中心に  

•  これからも需要がある限り2ヶ月に1回開催予定  –  4/13(土)予定  

2013/02/23 OSC  2013  Tokyo/Spring 6

Page 7: 20130223 OSC Tokyo/Spring

今日の内容

•  個人的に面白い/役に立つシェル芸10個を紹介  

•  せっかくUSP研究所名義で発表するので、  いくつかはビジネス版で拡張シェル芸をお魅せします。  (大風呂敷)  

2013/02/23 OSC  2013  Tokyo/Spring 7

Page 8: 20130223 OSC Tokyo/Spring

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

Page 9: 20130223 OSC Tokyo/Spring

解答

•  $  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

Page 10: 20130223 OSC Tokyo/Spring

2.  数を数える

•  テキストファイル(原稿)から  「Ubuntu」の文字を数える  

2013/02/23 OSC  2013  Tokyo/Spring 10

Page 11: 20130223 OSC Tokyo/Spring

解答

•  $  grep  Ubuntu  *.rst  |  sed  's/:.*//'  |  sort  |  uniq  -­‐c

2013/02/23 OSC  2013  Tokyo/Spring 11

Page 12: 20130223 OSC Tokyo/Spring

3.  データ抽出

•  キー  a,  b  それぞれについて、一番大きい数字を取り出してください。

2013/02/23 OSC  2013  Tokyo/Spring 12

Page 13: 20130223 OSC Tokyo/Spring

解答

•  $  cat  hoge  |  sort  -­‐k1,1  -­‐k2,2nr  |  uniq  -­‐w  1  (Mac  等だと guniq  を使う)

2013/02/23 OSC  2013  Tokyo/Spring 13

Page 14: 20130223 OSC Tokyo/Spring

4.    日付の計算

•  1978年2月16日は、  2013年2月23日の何日前でしょう?

2013/02/23 OSC  2013  Tokyo/Spring 14

Page 15: 20130223 OSC Tokyo/Spring

解答

•  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

Page 16: 20130223 OSC Tokyo/Spring

5.  リストにないものを探す

•  1から10までの数字のうち、numにないものは?

2013/02/23 OSC  2013  Tokyo/Spring 16

Page 17: 20130223 OSC Tokyo/Spring

解答

•  $  seq  1  10  |  cat  -­‐  num  |  sort  |  uniq  –u  •  $  sort  num  <(seq  1  10)  |  uniq  -­‐u

2013/02/23 OSC  2013  Tokyo/Spring 17

Page 18: 20130223 OSC Tokyo/Spring

6.  エクセルの読み書き

•  ビジネス版  – 読み  •  $  rexcelx  1  book.xlsx    

– 書き  •  $  echo  {1..10}  |  wexcelx  ./book.xlsx  1  A7  -­‐  >  out.xlsx  

2013/02/23 OSC  2013  Tokyo/Spring 18

Page 19: 20130223 OSC Tokyo/Spring

7.  速いソート  

•  1億行のデータのソート  

2013/02/23 OSC  2013  Tokyo/Spring 19

Page 20: 20130223 OSC Tokyo/Spring

解答(というよりベンチマーク)

2013/02/23 OSC  2013  Tokyo/Spring 20

Page 21: 20130223 OSC Tokyo/Spring

8.  ソートして集計

2013/02/23 OSC  2013  Tokyo/Spring 21

Page 22: 20130223 OSC Tokyo/Spring

9.  足し算する(精度よく)

•  答え:212702.890832364364363

2013/02/23 OSC  2013  Tokyo/Spring 22

Page 23: 20130223 OSC Tokyo/Spring

解答

•  $  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

Page 24: 20130223 OSC Tokyo/Spring

10.  横に並んだ数字のソート

•  各行について、数字を小さい方から横に並べる。

2013/02/23 OSC  2013  Tokyo/Spring 24

Page 25: 20130223 OSC Tokyo/Spring

解答

•  $  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

Page 26: 20130223 OSC Tokyo/Spring

まとめ

•  端末は(シェル芸で修行すれば)便利  •  4/13(予定)遊びに来てください

2013/02/23 OSC  2013  Tokyo/Spring 26