O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

20131102 第7回シェル芸勉強会

13.036 visualizações

Publicada em

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

  • Seja o primeiro a comentar

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

×