20131222 第8回シェル芸勉強会スライド
DESCRIPTION
2013/12/22 シェル芸勉強会@KDDIウェブコミュニケーションズTRANSCRIPT
第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