Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20131102 第7回シェル芸勉強会

13,018 views

Published on

KDDIウェブコミュニケーションズにて。講師スタッフ含め36人出席

  • Be the first to comment

20131102 第7回シェル芸勉強会

  1. 1. 第7回俺とお前のゆるゆる   シェル芸勉強会 USP友の会 上田 隆一
  2. 2. 近況 •  本書いてます。   •  風邪薬で精神が朦朧としております。   2013/11/2 第7回シェル芸勉強会 2
  3. 3. はじめに •  ブログが盛り上がりました。 2013/11/2 第7回シェル芸勉強会 3
  4. 4. 喜んではいかん! •  サーバが落ちた。落ち方が悪い。   –  メモリ使い過ぎ mysqld   お前だよ。 2013/11/2 第7回シェル芸勉強会 4
  5. 5. •  bashCMSならこんなに耐えるのに・・・   –  注:実際にリクエストに応えているかは不明 2013/11/2 第7回シェル芸勉強会 5
  6. 6. むやみにDRAM使うたらあかんで! •  データを扱いたかったら基本はコレやろ!   標準入力  →  標準出力   (DRAM使ってよいのはsort(1)の類いのコマンドだけ)   •  ウェブ業界にもシェル芸を!   •  ネオヒルズ族にもシェル芸を!(違う)   2013/11/2 第7回シェル芸勉強会 6
  7. 7. シェル芸とは? •  マウスも使わず、ソースコードも残さず、GUIツールを立 ち上げる間もなく、あらゆる調査・計算・テキスト処理を CLI端末へのコマンド入力一撃で終わらすこと   –  定義のページを作った   •  hBp://blog.ueda.asia/   ?page_id=1434 シェル芸でロケットを飛ばす(嘘) 2013/11/2 第7回シェル芸勉強会 7
  8. 8. 今回の内容 •  問題10問   –  マニアックオプション大会   –  簡単な文章いじり(ブログが盛り上がったので追加)   2013/11/2 第7回シェル芸勉強会 8
  9. 9. 注意 •  解答例は  Mac  で作成   •  Linux  の人は  gawk,  gsed,  tail  -­‐r  等々を適宜 awk,  sed,  tac     に読み替えのこと   •  その他環境でも、解答例にこだわらずネット等を   調べながら解答願います。   •  解答では、例題が解ければよい。   –  一般解を探すのは、場合によっては悪い癖となる。   2013/11/2 第7回シェル芸勉強会 9
  10. 10. 問題1 •  ドットで区切られた4つの数字について、   左側の数字を優先に   数字の小さい順に並べてください。 2013/11/2 第7回シェル芸勉強会 10
  11. 11. 解答 •  $  sort  -­‐t.  -­‐k1,1n  -­‐k2,2n  -­‐k3,3n  -­‐k4.4n  ip   •  $  cat  ip  |  tr  '.'  '  '  |     sort  -­‐k1,1n  -­‐k2,2n  -­‐k3,3n  -­‐k4,4n  |  tr  '  '  '.'   2013/11/2 第7回シェル芸勉強会 11
  12. 12. 問題2 •  次の文について、taxi,  1km,  10000の前後に半角   スペースを挿入してください   –  このtaxiは1kmあたり10000円   2013/11/2 第7回シェル芸勉強会 12
  13. 13. 解答 •  $  echo  このtaxiは1kmあたり10000円 |     sed  's/[a-­‐z0-­‐9][a-­‐z0-­‐9]*/  &  /g'   •  $  echo  このtaxiは1kmあたり10000円 |    gsed  's/[a-­‐zA-­‐Z0-­‐9]+/  &  /g' 2013/11/2 第7回シェル芸勉強会 13
  14. 14. 問題3 •  次の文についてspaceの前・invaderの後ろ・   4の後ろのスペースを除去してください。   –  私の名前は space  invader  です。4  歳です。 2013/11/2 第7回シェル芸勉強会 14
  15. 15. 解答 •  $    echo  私の名前は space  invader  です。4  歳です。 |     sed  's/  space/space/'  |  sed  's/der  /der/'  |  sed  's/4  /4/'   •  $  echo  私の名前は space  invader  です。4  歳です。 |     sed  's/([^a-­‐zA-­‐Z0-­‐9])  ([a-­‐zA-­‐Z0-­‐9])/12/g'  |     sed  's/([a-­‐zA-­‐Z0-­‐9])  ([^a-­‐zA-­‐Z0-­‐9])/12/g'   •  $  echo  私の名前は space  invader  です。4  歳です。 |     sed  's/([^[:alnum:]])  ([[:alnum:]])/12/g'  |     sed  's/([[:alnum:]])  ([^[:alnum:]])/12/g' 2013/11/2 第7回シェル芸勉強会 15
  16. 16. 問題4 •  次のマーク付きの文について   「<b>hoge</b>」が重複していることを   ワンライナーで示してください。   –  <b>hoge</b>は<b>fuge</b>なので<b>hoge</ b>fugeだよね。   2013/11/2 第7回シェル芸勉強会 16
  17. 17. 解答 •  $  echo  '(略)'  |  grep  -­‐o  '<b>hoge</b>'  |  sort  |  uniq  –d   •  $  echo  '(略)'  |  grep  -­‐o  '<b>[^<]*</b>'  |  sort  |  uniq  –d   •  grep  –o  なし   –  $  echo  '(略)'  |  gsed  's/<b>/n&/g'  |  gsed  's;</b>;&n;g'  |   grep  '^<b>'  |  sort  |  uniq  -­‐d 2013/11/2 第7回シェル芸勉強会 17
  18. 18. 問題5 •  00001〜20000という名前の空のファイルを   作ってください。   2013/11/2 第7回シェル芸勉強会 18
  19. 19. 解答 •  $    seq  -­‐w  1  20000  |  xargs  touch   •  $  seq  1  20000  |  awk  '{prinj("%05dn",$1)}'  |   xargs  touch   •  Tukubaiを使用した例   –  $  seq  1  20000  |  maezero  1.5  |  xargs  touch 2013/11/2 第7回シェル芸勉強会 19
  20. 20. 問題6 •  a)  さきほど作った2万個のファイルのリストを   なるべく短い時間で作ってください。     •  b)  ファイルを消してください。 2013/11/2 第7回シェル芸勉強会 20
  21. 21. 解答 •  問題a   –  $  ls  -­‐f  >  /tmp/list   •  問題b   –  $  pme  rm  –Rf  <ディレクトリ>   –  $  pme  echo  *  |  xargs  rm   –  $  ls  -­‐f  |  xargs  rm   (ただしエラーが出る)   –  $  ls  -­‐U  |  xargs  rm     2013/11/2 第7回シェル芸勉強会 21
  22. 22. 問題7 •  右下の図のようなディレクトリ、ファイルを作り、   例えば      ./a/001  なら  ./a_001    ./b/c/123  なら  ./b_c_123   のようにパスの「/」を   アンダースコアに変えて、   ./  にコピーを置いてください。   –  できる人はwhileやfor   を使わないで   2013/11/2 第7回シェル芸勉強会 22
  23. 23. 解答 •  $  find  .  -­‐type  file  |  sed  's;./;;'  |  while  read  f  ;  do  cp  $f   $(echo  $f  |  sed  's;/;_;g')  ;  done     •  $  find  .  -­‐type  file  |  sed  's;./;;'  |  gawk  '{print   $1,gensub(///,"_","g",$1)}'  |  xargs  -­‐n  2  cp   •  会場から   –  $  find  .  -­‐type  file  |  sed  's;./;;'  |  gawk  '{print  "cp", $1,gensub(///,"_","g",$1)}'  |  sh 2013/11/2 第7回シェル芸勉強会 23
  24. 24. 問題8 •  /etc/  下の読み込み可能な各ファイルについて、   fooと書いてある行の数を数えてください   2013/11/2 第7回シェル芸勉強会 24
  25. 25. 解答 •  $  grep  –c  -­‐r  foo  /etc  2>  /dev/null   •  $  grep  -­‐r  foo  /etc  2>  /dev/null  |  sed  's/:.*//'  |  uniq  -­‐c 2013/11/2 第7回シェル芸勉強会 25
  26. 26. 問題9 •  今度は、/etc/  下の読み込み可能な各ファイル   について、fooの数を数えてください   2013/11/2 第7回シェル芸勉強会 26
  27. 27. 解答 •  Macの場合(面倒)   –  $  grep  -­‐r  -­‐o  foo  /etc  2>  /dev/null  |     awk  '{if($1=="foo"){print  a}else{print;a=$1}}'  |     uniq  –c   •  GNU  grepだと楽   –  $  grep  -­‐r  -­‐o  foo  /etc  2>  /dev/null  |  uniq  –c   •  GNU  Awkユーザ会会長のこわい解答   –  $  find  /etc/  -­‐type  file  |  xargs  -­‐n  1  awk  '{a+=gsub(/foo/,"")} END{print  FILENAME,a}' 2013/11/2 第7回シェル芸勉強会 27
  28. 28. 問題10 •  日付の古い順にソートしてください 2013/11/2 第7回シェル芸勉強会 28
  29. 29. 解答 •  $  cat  days  |  LANG=C  gdate  "+%s"  -­‐f  -­‐  |  sort  |  awk   '{print  "@"  $1}'  |  LANG=C  gdate  "+%b  %d,  %Y"  -­‐f  -­‐  |   sed  's/  0/  /'   •  会場から   –  $  cat  days  |  sort  -­‐k3,3  -­‐k1,1M  -­‐k2,2n   2013/11/2 第7回シェル芸勉強会 29
  30. 30. おわりに •  次は・・・   #!/usr/local/beer/bash     (BSDっぽくしてみた。)   2013/11/2 第7回シェル芸勉強会 30

×