第8回クリスマスって何だっけ	
  
シェル芸なら知ってる勉強会	
USP友の会 上田 隆一
近況	
•  本、書きました。編集待ち。	
  
•  本、書いてます。	
  

2013/12/22	

第8回シェル芸勉強会	

2
イントロダクション	
•  いつもいまいちウケがよくないので割愛	

2013/12/22	

第8回シェル芸勉強会	

3
シェル芸とは?	
•  毎回書くのが面倒なので続きはWebで	
  
–  h/p://blog.ueda.asia/?page_id=1434	

2013/12/22	

第8回シェル芸勉強会	

4
今回の進め方	
•  ビギナー置いてきぼり現象にメス	
  
	
  
•  4〜6人でチーム分け	
  
–  できる人+そこそこの人+ビギナー※	
  
(※自称ビギナー除く)	
  
–  できる人:とりまとめ	
  
–  そこそこの人:考える、ビギナーの人のサポート	
  
–  ビギナーの人:見て真似をする	
2013/12/22	

第8回シェル芸勉強会	

5
•  問題は8問	
  
•  1問15分	
  
•  解答はUbuntu	
  Linuxで作りました。	

2013/12/22	

第8回シェル芸勉強会	

6
問題1	
•  二つずつ数字をフリップしてください	
  
•  例	
  
–  入力:	
  1	
  2	
  3	
  4	
  5	
  6	
  7	
  8	
  9	
  10	
  
–  出力:	
  2	
  1	
  4	
  3	
  6	
  5	
  8	
  7	
  10	
  9	

2013/12/22	

第8回シェル芸勉強会	

7
解答	
•  $	
  echo	
  {1..10}	
  |	
  xargs	
  -­‐n	
  2	
  |	
  awk	
  '{print	
  $2,$1}'	
  |	
  xargs	
  	
  
•  $	
  echo	
  {1..10}	
  |	
  	
  
awk	
  '{for(i=1;i<=9;i+=2){print	
  $(i+1),$i}}'	
  |	
  xargs	
  
•  $	
  echo	
  {1..10}	
  |	
  sed	
  's/[0-­‐9]*	
  [0-­‐9]*	
  /&n/g'	
  |	
  	
  
awk	
  '{print	
  $2,$1}'	
  |xargs	
  
•  Tukubai使用	
  
–  $	
  echo	
  {1..10}	
  |	
  yarr	
  -­‐2	
  |	
  self	
  2	
  1	
  |	
  yarr	
  
2013/12/22	

第8回シェル芸勉強会	

8
問題2	
•  「ユニケージ」「ユニゲージ」「UPS」「USP」の各個数を
数えてください。	
  
–  ユニゲージユニケージユニゲージUSP友の会USP友の会
UPS友の会UPS友の会	

2013/12/22	

第8回シェル芸勉強会	

9
解答	
•  $	
  echo	
  <省略>|	
  	
  
grep	
  -­‐oE	
  "(ユニゲージ|ユニケージ|USP|UPS)"	
  |	
  sort	
  |	
  uniq	
  -­‐c	
  
•  ファイルを使う方法	
  
–  $	
  cat	
  memo	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ユニケージ	
ユニゲージ	
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  USP	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  UPS	
  
–  $	
  echo	
  <省略>|	
  grep	
  -­‐o	
  -­‐f	
  memo	
  |	
  sort	
  |	
  uniq	
  -­‐c	
  

2013/12/22	

第8回シェル芸勉強会	

10
問題3	
•  次の4個のファイルを作り、同じ内容のものを	
  
探し出すワンライナーを作成してください。	
  
–  echo	
  12345	
  >	
  file1	
  
–  echo	
  23456	
  >	
  file2	
  
–  echo	
  12345	
  >	
  file3	
  
–  echo	
  45678	
  >	
  file4	

2013/12/22	

第8回シェル芸勉強会	

11
解答	
•  $	
  ls	
  file[1-­‐4]	
  |	
  xargs	
  md5sum	
  |	
  	
  
awk	
  '{a[$1]	
  =	
  a[$1]"	
  "$2}END{for(v	
  in	
  a){print	
  a[v]}}'	
  |	
  
awk	
  'NF>1'	
  
•  Tukubai使用	
  
–  $	
  ls	
  file[1-­‐4]	
  |	
  xargs	
  md5sum	
  |	
  sort	
  |	
  yarr	
  num=1	
  |	
  awk	
  
'NF>2'	

2013/12/22	

第8回シェル芸勉強会	

12
問題4	
•  数字の列を偶数と奇数に分けてください。	
  
ただし、偶数、奇数の列内での数字の並びを	
  
変えないように。	
  
•  例	
  
–  入力:3	
  8	
  2	
  10	
  1	
  8	
  9	
  
–  出力:8	
  2	
  10	
  8	
  3	
  1	
  9	
  

2013/12/22	

第8回シェル芸勉強会	

13
解答	
•  $	
  echo	
  3	
  8	
  2	
  10	
  1	
  8	
  9	
  |	
  tr	
  '	
  '	
  'n'	
  |	
  
awk	
  '{print	
  $1%2,$1}'	
  |	
  sort	
  -­‐s	
  -­‐k1,1	
  |	
  
awk	
  '{print	
  $2}'	
  |	
  xargs	
  
	
  
•  $	
  echo	
  3	
  8	
  2	
  10	
  1	
  8	
  9	
  |	
  tr	
  '	
  '	
  'n'	
  |	
  	
  
awk	
  'BEGIN{b=0}$1%2{a[b]=$1;b++}$1%2==0{print}
END{for(i=0;i<b;i++){print	
  a[i]}}'	
  |	
  xargs	
  

2013/12/22	

第8回シェル芸勉強会	

14
問題5	
•  次のように連続した0と1の数を数え、	
  
次のように変換してください	
  
–  0と1が連続したときは0	
  or	
  1の後ろに	
  
個数をつけてスペースを挿入	
  
–  0と1が連続していないときはスペース区切りでそのまま出力	
  
–  例	
  
•  入力:	
  000001111111111001010	
  
•  出力:	
  05	
  110	
  02	
  1	
  0	
  1	
  0	

2013/12/22	

第8回シェル芸勉強会	

15
解答	
•  $	
  echo	
  000001111111111001010	
  |	
  sed	
  's/./&n/g'	
  |	
  	
  
uniq	
  -­‐c	
  |	
  awk	
  'NF==2{print	
  $2,$1}'	
  |	
  	
  
sed	
  's/	
  1$//'	
  |	
  tr	
  -­‐d	
  '	
  '	
  |	
  xargs	

2013/12/22	

第8回シェル芸勉強会	

16
問題6	
•  数字の列を次のように整形してください	
  
–  小さい順に空白区切りで並んだ自然数に対し、	
  
2個以上の数字が連続した場合は両端の数字だけ残して	
  
間にハイフンを入れる	
  
–  例	
  
•  入力:1	
  2	
  3	
  5	
  6	
  8	
  10	
  11	
  12	
  15	
  
•  出力:1-­‐3	
  5-­‐6	
  8	
  10-­‐12	
  15	
  

2013/12/22	

第8回シェル芸勉強会	

17
解答	
•  $	
  echo	
  1	
  2	
  3	
  5	
  6	
  8	
  10	
  11	
  12	
  15	
  |	
  tr	
  '	
  '	
  'n'	
  |	
  	
  
awk	
  'BEGIN{a=1}{print	
  ($1-­‐a==1?",":"	
  ")$1;a=$1}'	
  |	
  	
  
tr	
  -­‐d	
  'n'	
  |	
  sed	
  's/$/n/g'	
  |	
  sed	
  's/,[^	
  ]*,/-­‐/g'	
  |	
  tr	
  ","	
  "-­‐"	
  
•  $	
  echo	
  1	
  2	
  3	
  5	
  6	
  8	
  10	
  11	
  12	
  15	
  |	
  	
  
awk	
  '{for(i=1;i<=NF;i++){print	
  $i,$(i+1)-­‐$i}}'	
  |	
  	
  
awk	
  '$2==1{print	
  $1","}$2!=1{print	
  $1"	
  "}'	
  |	
  	
  
tr	
  -­‐d	
  'n'	
  |	
  tr	
  ','	
  '-­‐'	
  |	
  sed	
  's/-­‐[0-­‐9]*-­‐/-­‐/g'	
  |	
  awk	
  '{print}'	
  
•  $	
  echo	
  1	
  2	
  3	
  5	
  6	
  8	
  10	
  11	
  12	
  15	
  |	
  xargs	
  -­‐n	
  1	
  |	
  	
  
awk	
  '{print	
  $1,$i-­‐a;a=$1}'	
  |	
  awk	
  '$2>1{print	
  "";prino	
  $1"	
  "}
$2==1{prino	
  $1"	
  "}'	
  |	
  
	
  awk	
  '{print	
  $1,$NF}'	
  |	
  awk	
  '$1==$2{print	
  $1}$1!=$2{print}'	
  |	
  
	
  tr	
  '	
  '	
  '-­‐'	
  |	
  xargs	
2013/12/22	

第8回シェル芸勉強会	

18
問題7	
•  次の文字列は、数字3桁の安直なパスワードを	
  
MD5ハッシュしたものです。	
  
パスワードを破ってください。	
  
「250cf8b51c773f3f8dc8b4be867a9a02」	
  
–  注意:MD5値を求めるときには改行記号を入れていません。	

2013/12/22	

第8回シェル芸勉強会	

19
解答	
•  $	
  seq	
  -­‐w	
  000	
  999	
  |	
  	
  
while	
  read	
  n	
  ;	
  do	
  echo	
  -­‐n	
  $n"	
  "	
  ;echo	
  -­‐n	
  $n	
  |	
  	
  
md5sum;	
  done	
  |	
  grep	
  250cf8b51	
  
•  $	
  echo	
  'echo	
  -­‐n	
  @"	
  ";	
  echo	
  -­‐n	
  @	
  |	
  md5sum'	
  |	
  	
  
awk	
  '{for(i=0;i<=999;i++){print}}'	
  |	
  	
  
awk	
  '{gsub(/@/,sprino("%03d",NR-­‐1),$0);print}'	
  |	
  
	
  sh	
  |	
  grep	
  250cf8b51	
  

2013/12/22	

第8回シェル芸勉強会	

20
問題8	
•  /usr/share/dict/wordsでしりとりを完成させてくださ
い	
  
–  8つ以上単語を並べること	
  

•  辞書のインストール	
  
–  sudo	
  apt-­‐get	
  install	
  wamerican等	
  

2013/12/22	

第8回シェル芸勉強会	

21
解答	
•  Tukubai使用	
  
–  $	
  sort	
  -­‐R	
  /usr/share/dict/words	
  |	
  yarr	
  -­‐2	
  |	
  	
  
awk	
  'substr($1,length($1),1)	
  ==	
  substr($2,1,1)'	
  |	
  	
  
sort	
  -­‐R	
  |	
  yarr	
  -­‐4	
  |	
  
awk	
  'substr($2,length($2),1)	
  ==	
  substr($3,1,1)'	
  |	
  	
  
sort	
  -­‐R	
  |	
  yarr	
  -­‐8	
  |	
  
awk	
  'substr($4,length($4),1)	
  ==	
  substr($5,1,1)'	
  

•  インチキ	
  
–  $	
  grep	
  '^s'	
  /usr/share/dict/words	
  |	
  grep	
  's$'	
  |	
  tr	
  'n'	
  '	
  '	

2013/12/22	

第8回シェル芸勉強会	

22
おわりに	
•  カレー屋に移動!	
  

2013/12/22	

第8回シェル芸勉強会	

23

20131222 第8回シェル芸勉強会スライド