第5回シェル芸勉強会 (プレーンタイプ)
USP友の会 上田 隆一
近況
• 8月、シェル芸勉強会が某所に殴り込み • 8月、私自身、某所に殴り込み
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 2
こっちに来るな
h-p://typhoon.yahoo.co.jp/weather/jp/typhoon/eye/ 2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 3
こんなのも来てた(PM2.5)
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 4
どうする?
シェル芸でやり過ごす!
来るのはしょーがない
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 5
シェル芸とは?
• マウスも使わず、ソースコードも残さず、 GUIツールを立ち上げる間もなく、 あらゆる調査・計算・ テキスト処理を コマンド入力一撃で終わらす。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 6
セルゲイ・ハリトーノフ(無関係)
今回の内容
• ベーシックな問題10問 – ファイル・ディレクトリ操作 – sed & AWKのパズル
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 7
注意
• 解答例は Mac で作成 • Linux の人は gawk, gsed, tail -‐r を適宜 awk, sed, tac
に読み替えのこと • その他環境でも、解答例にこだわらずネット等を
調べながら解答願います。
• 解答では、例題が解ければよい。 – 一般解を探すのは、場合によっては悪い癖となる。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 8
問題1 • あるディレクトリで適当にファイルへの
シンボリックリンクを作り、リンク先のファイルを コピーして実体のあるファイルに置き換えてください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 9
解答
• $ 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
問題2
• /etc/hosts と /etc/resolv.conf をつなげて、 以下のように各行に元のファイル名がついた 一つのファイルを作ってください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 11
解答
• $ grep "" /etc/hosts /etc/resolv.conf |sed 's/:/ /' • $ awk '{print FILENAME,$0}' /etc/hosts /etc/resolv.conf
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 12
問題3
• 問題2で作ったファイルを適当なディレクトリの下に復元してください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 13
解答
• $ 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
問題4
• a, bそれぞれについて、一番下にある行を 取り出してください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 15
解答
• 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
問題5
• 下の図のように魔方陣を作って、 魔方陣になっているかどうか確認してください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 17
解答
• 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
問題6
• /usr/share/dict/words 等辞書ファイルから、 大文字で始まる単語、小文字で始まる単語の数を数えてください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 19
解答
• $ 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
問題7
• $ echo ダァシエリイェス して、ワンライナーで字を反転してください。 (「ダ」がめんどくさい)
スェイリエシァダ
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 21
解答
• $ 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
問題8
• 以下のような図形を出力してください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 23
解答
• $ 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
問題9
• 右図のように縦に一つずつ ランダムにずらして 字を出力してください。
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 25
解答
• $ 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
問題10
• /usr/share/dict/words から抽出した単語で、 this is a pen という出力を得てください。 – ただし、数字は一切使わないこと – シェル変数、ファイルに出力もしないこと – for, while, && 禁止
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 27
解答
• $ 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
おわりに
• 次は・・・
#!/beer/bash
(このスライド、使い回し。)
2013/6/22 第5回シェル芸勉強会(プレーンタイプ) 29