Upload
ryuichi-ueda
View
2.368
Download
0
Embed Size (px)
DESCRIPTION
12/8勉強会。sh行。
Citation preview
USP友の会 会長 presents 第2回チキチキ!
シェル芸人養成勉強会
USP友の会 上田 隆一
2012年12月8日 USP友の会勉強会 2
近況
● 原稿いっぱい書いてます。
2012年12月8日 USP友の会勉強会 3
今日やること
USP友の会が何の会なのか知らしめる
2012年12月8日 USP友の会勉強会 4
今日やること
● USP友の会は何の会か知ってますか?
– 無停電なんとか装置ではありません。
– 会員殿、我々の会は、なんの会でしょう?
2012年12月8日 USP友の会勉強会 5
今日やること● 【重要】我々の会は、
アル中のリハビリ互助会ではない。
2012年12月8日 USP友の会勉強会 6
今日やること
● 飲んでばっかりはあかん!– シェル芸で脳味噌デトックス
2012年12月8日 USP友の会勉強会 7
シェル芸とは? (スライド再利用!)
● マウスも使わず、プログラムも書かず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・ファイル処理をコマンド入力一撃で終わらす。
※シェル芸人イメージ(麻雀は天和で終わらす)
2012年12月8日 USP友の会勉強会 8
ということで(これも再利用)
● 端末操作だけでいろんな仕事をできるようになってもらいます。
– シェルスクリプト?そんな大げさなもんいらん。
– 今回の内容をおさえればクソ長いシェルスクリプトは書かなくなることでしょう・・・
– 今回はエディタすら使用禁止
2012年12月8日 USP友の会勉強会 9
時間割
● ~18:30– 最後までワンライナー地獄
2012年12月8日 USP友の会勉強会 10
問題の解き方
● 基本はbashかshで
● 使えるコマンドはなんでも使え– posixとか気にするのはできるようになってから!
● できる人はいろいろな方法で挑戦– それも終わったら他の人を指導
– 玄人勢の献身がこの勉強会を成功させます!
2012年12月8日 USP友の会勉強会 11
問題1: 文字化けしたファイルの削除
● 次のように、空ファイル abc, DEFG と、文字化けした空ファイルを作ってください。
● 文字化けしたファイルを消してください。ただし、日本語の入力は禁止です。
2012年12月8日 USP友の会勉強会 12
問題1: 答え
● シンプルな答え
– $ rm [!a-zA-Z]*
● 確認してから消す
– $ echo [!a-zA-Z]* | xargs rm
● ワイルドカードが思いつかない場合
– $ ls | grep '[^a-zA-Z]' | xargs rm
2012年12月8日 USP友の会勉強会 13
問題2: 計算
● 以下のファイル中の数字を全部足し算してください。
2012年12月8日 USP友の会勉強会 14
問題2: 答え
● $ cat num | awk '{for(i=1;i<=NF;i++){a+=$i}}END{print a}'
● $ tr ' ' '\n' < num | awk '{a+=$1}END{print a}'
● Tukubai– $ tarr num | sm2 0 0 1 1
– $ yarr num | ysum | self NF
2012年12月8日 USP友の会勉強会 15
問題3: 条件でデータを取り出し
● 右のhogeファイルから、aとbについてそれぞれ一番大きな数を求めましょう。
2012年12月8日 USP友の会勉強会 16
問題3: 答え
● $ cat hoge | sort -k1,1 -k2,2nr | uniq -w 1● $ cat hoge | sort -k1,1 -k2,2nr | sort -u -k1,1
● Tukubai 使用– $ cat hoge | sort -k1,1 -k2,2nr | getfirst 1 1
– $ cat hoge | sort -k1,1 -k2,2n | getlast 1 1
– $ cat hoge | sort -k1,1 -k2,2nr | yarr num=1 | self 1 2
2012年12月8日 USP友の会勉強会 17
問題4: 計算
● 以下のファイル中の数字を、キー(a,b)ごとに全部足し算してください。
2012年12月8日 USP友の会勉強会 18
問題4: 答え
● $ sort num2 | awk '{for(i=1;i<=NF;i++){if($1=="a"){a+=$i}else{b+=$i}}}END{print a,b}'
● Tukubai– $ tarr num=1 num2 | sort | sm2 1 1 2 2
2012年12月8日 USP友の会勉強会 19
問題5: 日付と曜日
● 以下のようにファイルを作って、何曜日が何日あるか集計してください。
2012年12月8日 USP友の会勉強会 20
問題5: 答え
● $ cat osyoga2 | while read d ; do date -d $d ; done | sed 's/.*\(.\)曜日.*$/\1/' | sort | uniq -c
● $ cat osyoga2 | date -f - | awk '{print $4}' | sort | uniq -c
● Tukubai 使用– $ cat osyoga2 | yobi -j 1 | self 2 | sort | count 1 1
● 日曜日から出力– $ cat osyoga2 | yobi 1 | yobi -j 1 | self 3 2 | sort | count 1 2 | delf 1
2012年12月8日 USP友の会勉強会 21
問題6: ダミーデータの作成
● seq 1 100 の出力をランダムに並び替えてください。
2012年12月8日 USP友の会勉強会 22
問題6: 答え
● $ seq 1 100 | awk '{print rand(),$1}' | sort | awk '{print $2}'
● $ seq 1 100 | while read n ; do echo $RANDOM $n ; done | sort | while read m n ; do echo $n ; done
2012年12月8日 USP友の会勉強会 23
問題7: 検索● 大文字小文字を区別しない場合、以下の辞書ファイルから、
重複する単語を検索してください。
– asciiコード以外の字がありますが、とりあえず気にしないでください。
2012年12月8日 USP友の会勉強会 24
問題7: 答え
● $ cat /usr/share/dict/words | tr 'A-Z' 'a-z' | sort | uniq -d
● $ cat /usr/share/dict/words | tr 'A-Z' 'a-z' | sort | uniq -c | awk '$1>1'
2012年12月8日 USP友の会勉強会 25
問題8: ファイルの比較
● file2から、file1にない数字を抽出してください。
2012年12月8日 USP友の会勉強会 26
問題8: 答え
● $ diff file1 file2 | awk '$1==">"{print $2}'● $ comm -13 file1 file2● $ cat file2 | grep -v -f file1● $ join -v2 file1 file2● $ awk '{print $1,FILENAME}' file{1,2} | sort -u -k1,1 | grep file2 |
self 1
● Tukubai– $ awk '{print $1,FILENAME}' file{1,2} | sort | yarr num=1 | awk '$2~/2$/' | self 1
– $ join0 +ng key=1 file1 file2 > /dev/null
2012年12月8日 USP友の会勉強会 27
問題9: 形式変換
● 左のようなファイルを作り、右のように整形してください。
2012年12月8日 USP友の会勉強会 28
問題9: 答え
● $ cat game | awk '{print $2,$1,$3}' | sort | awk '{print $1,$3}' | awk 'BEGIN{k=""}{if(k!=$1){print "";k=$1;printf("%s ",$1)}printf("%s ",$2)}END{print ""}' | sed 's/^$/ 1 2 3 4 5/'
● Tukubai使用
– $ map num=1 game | tateyoko | keta | sed 's/\*/ /'
2012年12月8日 USP友の会勉強会 29
問題10: ファイルの結合
● file1、file2 から、下の出力を得てください。
2012年12月8日 USP友の会勉強会 30
問題10: 答え
● $ sort -ms -k1,1 file1 file2 | awk 'NR%2==1{printf $0}NR%2==0{print " "$2}'
● $ sort -m file1 file2 | awk 'NR%2==1{printf $0}NR%2==0{print " "$2}' | awk '{print $1,$3,$2}'
● join file1 file2
● Tukubai– $ loopj num=1 file1 file2
– $ join1 key=1 file1 file2
– $ up3 key=1 file1 file2 | yarr num=1
2012年12月8日 USP友の会勉強会 31
まとめ
● お疲れさまでした!!● 2月あたりにまたやりますよ。
● さあ、飲みにいきましょう。