29
5回シェル芸勉強会 (プレーンタイプ) USP友の会 上田 隆一

20130622第5回シェル芸勉強会スライド

Embed Size (px)

DESCRIPTION

@KDDIウェブコミュニケーションズ様

Citation preview

Page 1: 20130622第5回シェル芸勉強会スライド

第5回シェル芸勉強会  (プレーンタイプ)

USP友の会 上田 隆一

Page 2: 20130622第5回シェル芸勉強会スライド

近況

•  8月、シェル芸勉強会が某所に殴り込み  •  8月、私自身、某所に殴り込み  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 2

Page 3: 20130622第5回シェル芸勉強会スライド

こっちに来るな

h-p://typhoon.yahoo.co.jp/weather/jp/typhoon/eye/ 2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 3

Page 4: 20130622第5回シェル芸勉強会スライド

こんなのも来てた(PM2.5)

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 4

Page 5: 20130622第5回シェル芸勉強会スライド

どうする?

   

シェル芸でやり過ごす!    

来るのはしょーがない

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 5

Page 6: 20130622第5回シェル芸勉強会スライド

シェル芸とは?

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

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 6

セルゲイ・ハリトーノフ(無関係)

Page 7: 20130622第5回シェル芸勉強会スライド

今回の内容

•  ベーシックな問題10問  – ファイル・ディレクトリ操作  – sed  &  AWKのパズル  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 7

Page 8: 20130622第5回シェル芸勉強会スライド

注意

•  解答例は  Mac  で作成  •  Linux  の人は  gawk,  gsed,  tail  -­‐r  を適宜 awk,  sed,  tac    

に読み替えのこと  •  その他環境でも、解答例にこだわらずネット等を  

調べながら解答願います。  

•  解答では、例題が解ければよい。  –  一般解を探すのは、場合によっては悪い癖となる。  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 8

Page 9: 20130622第5回シェル芸勉強会スライド

問題1 •  あるディレクトリで適当にファイルへの  

シンボリックリンクを作り、リンク先のファイルを  コピーして実体のあるファイルに置き換えてください。  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 9

Page 10: 20130622第5回シェル芸勉強会スライド

解答

•  $  ls  -­‐l  |  grep  ^l  |  awk  '{print  $NF,$(NF-­‐2)}'  |  while  read  f  t  ;  do  mv  $t  $t.org  ;  cp  $f  $t  ;  done  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 10

Page 11: 20130622第5回シェル芸勉強会スライド

問題2

•  /etc/hosts  と  /etc/resolv.conf  をつなげて、  以下のように各行に元のファイル名がついた  一つのファイルを作ってください。

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 11

Page 12: 20130622第5回シェル芸勉強会スライド

解答

•  $  grep  ""  /etc/hosts  /etc/resolv.conf  |sed  's/:/  /'  •  $  awk  '{print  FILENAME,$0}'  /etc/hosts  /etc/resolv.conf  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 12

Page 13: 20130622第5回シェル芸勉強会スライド

問題3

•  問題2で作ったファイルを適当なディレクトリの下に復元してください。  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 13

Page 14: 20130622第5回シェル芸勉強会スライド

解答

•  $  cat  file  |  sed  's;/etc/;;'  |  awk  '{f=$1;sub(/^[^  ]*  /,"",$0);print  $0  >  f}'  

•  $  cat  file  |  sed  's;/etc/;;'  |  keycut  -­‐d  %1

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 14

Page 15: 20130622第5回シェル芸勉強会スライド

問題4

•  a,  bそれぞれについて、一番下にある行を  取り出してください。

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 15

Page 16: 20130622第5回シェル芸勉強会スライド

解答

•  cat  data2  |  sort  -­‐s  -­‐k1,1  |  awk  '{if($1=="a"){a=$2}else{b=$2}}END{print  "a",a;print  "b",b}'  

•  cat  data2  |  sort  -­‐s  -­‐k1,1  |  awk  '{n[$1]=$2}  END{print  "a",n["a"];print  "b",n["b"]}'  

•  $  cat  data2  |  sort  -­‐s  -­‐k1,1  |  tail  -­‐r  |  sort  -­‐u  -­‐k1,1r  •  $  cat  data2  |  sort  -­‐s  -­‐k1,1  |  tail  -­‐r  |  sort  -­‐us  -­‐k1,1  •  $  tail  -­‐r  data2  |  sort  -­‐su  -­‐k1,1  

•  $  cat  data2  |  sort  -­‐s  -­‐k1,1  |  getlast  1  1  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 16

Page 17: 20130622第5回シェル芸勉強会スライド

問題5

•  下の図のように魔方陣を作って、  魔方陣になっているかどうか確認してください。

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 17

Page 18: 20130622第5回シェル芸勉強会スライド

解答

•  AWKでゴリゴリ  –  $  cat  data1  |  awk  '{a+=$1;b+=$2;c+=$3;d+=$NR;  e+=$(4-­‐NR);print  $1+$2+$3}END{print  a,b,c,d,e}'  |    tr  '  '  '\n'  |  uniq  

•  Open  usp  Tukubaiを使う  $  cat  data1  |  ysum  |  self  4  |  uniq  $  tateyoko  data1  |  ysum  |  self  4  |  uniq  $  awk  '{a+=$NR;b+=$(4-­‐NR)}END{print  a;  print  b}'  data1  |  uniq  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 18

Page 19: 20130622第5回シェル芸勉強会スライド

問題6

•  /usr/share/dict/words  等辞書ファイルから、  大文字で始まる単語、小文字で始まる単語の数を数えてください。  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 19

Page 20: 20130622第5回シェル芸勉強会スライド

解答

•  $  cat  /usr/share/dict/words  |  sed  's/\(.\).*/\1/'  |  tr  'a-­‐z'  's-­‐s'  |  tr  'A-­‐Z'  'l-­‐l'  |  sort  |  uniq  –c  

•  $  cat  /usr/share/dict/words  |  sed  's/[a-­‐z].*/s/'  |  sed  's/[A-­‐Z].*/l/'  |  sort  |  uniq  –c  

•  $  cat  /usr/share/dict/words  |  self  1.1.1  |  awk  '$1>="a"{s++}$1<"a"{l++}END{print  s,l}’  

•  $  cat  /usr/share/dict/words  |  self  1.1.1  |  awk  '$1>="a"{print  "s"}$1<"a"{print  "l"}'  |  sort  |  count  1  1  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 20

Page 21: 20130622第5回シェル芸勉強会スライド

問題7

•  $  echo  ダァシエリイェス  して、ワンライナーで字を反転してください。  (「ダ」がめんどくさい)    

スェイリエシァダ

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 21

Page 22: 20130622第5回シェル芸勉強会スライド

解答

•  $  echo  ダァシエリイェス |  gsed  's/ダ/&\n/g'  |    gsed  '2s/./&\n/g'  |  tail  -­‐r  |  tr  -­‐d  '\n'  

•  $  echo  ダァシエリイェス |  gsed  -­‐e  's/ダ/ダ\n/'  -­‐e  's/./&\n/g'  |  tail  -­‐r  |  tr  -­‐d  '\n'    |  sed  's/ダ/ダ/'  

•  $  echo  ダァシエリイェス |  nkf  -­‐X  |  rev  |  nkf  –Z4  

•  $  echo  ダァシエリイェス |  zen  |  gsed  's/./&\n/g'  |    tail  -­‐r  |  tr  -­‐d  '\n'  |  han  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 22

Page 23: 20130622第5回シェル芸勉強会スライド

問題8

•  以下のような図形を出力してください。

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 23

Page 24: 20130622第5回シェル芸勉強会スライド

解答

•  $  echo  1  3  5  7  7  5  3  1  |  tr  '  '  '\n'  |  awk  '{print  4-­‐int($1/2),$1}'  |  awk  '{for(i=1;i<=$1;i++){prinu  "  "}for(i=1;i<=$2;i++){prinu  "a"}print  ""}’  

•  $  echo  4  1  |  awk  ‘NR==1{s=$1;a=1}END{for(i=1;i<=4;i++){print  s-­‐-­‐,a;a+=2}}’  |  awk  ‘{for(i=1;i<=$1;i++){prinu  “  ”};for(i=1;i<=$2;i++){prinu  “a”};print  “”}’  >  a  ;  tail  -­‐r  a  |  cat  a  –  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 24

Page 25: 20130622第5回シェル芸勉強会スライド

問題9

•  右図のように縦に一つずつ  ランダムにずらして  字を出力してください。

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 25

Page 26: 20130622第5回シェル芸勉強会スライド

解答

•  $  echo  15  |  awk  '{a=10;  for(i=1;i<=$1;i++){a=a+(rand()  >  0.5?-­‐1:1);print  a}}'  |    awk  '{for(i=1;i<=$1;i++){prinu  "  "}prinu  "o\n"}'

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 26

Page 27: 20130622第5回シェル芸勉強会スライド

問題10

•  /usr/share/dict/words  から抽出した単語で、    this  is  a  pen      という出力を得てください。  –  ただし、数字は一切使わないこと  –  シェル変数、ファイルに出力もしないこと  –  for,  while,  &&  禁止  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 27

Page 28: 20130622第5回シェル芸勉強会スライド

解答

•  $  cat  /usr/share/dict/words  |    awk  '/^this$/{prinu  "_  ";print}{print}'  |    awk  '/^is$/{prinu  "__  ";print}{print}'  |    awk  '/^a$/{prinu  "___  ";print}{print}'  |    awk  '/^pen$/{prinu  "___  ";print}{print}'  |    grep  ^_  |  sort  |  tr  -­‐d  '_'  |  tr  '\n'  '  '  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 28

Page 29: 20130622第5回シェル芸勉強会スライド

おわりに

•  次は・・・  

#!/beer/bash    

(このスライド、使い回し。)  

2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 29