31
USP友の会 会長 presents 第2回チキチキ! シェル芸人養成勉強会 USP友の会 上田 隆一

Uspstudy20121208

Embed Size (px)

DESCRIPTION

12/8勉強会。sh行。

Citation preview

Page 1: Uspstudy20121208

USP友の会 会長 presents 第2回チキチキ!

シェル芸人養成勉強会

USP友の会 上田 隆一

Page 2: Uspstudy20121208

2012年12月8日 USP友の会勉強会 2

近況

● 原稿いっぱい書いてます。

Page 3: Uspstudy20121208

2012年12月8日 USP友の会勉強会 3

今日やること

USP友の会が何の会なのか知らしめる

Page 4: Uspstudy20121208

2012年12月8日 USP友の会勉強会 4

今日やること

● USP友の会は何の会か知ってますか?

– 無停電なんとか装置ではありません。

– 会員殿、我々の会は、なんの会でしょう?

Page 5: Uspstudy20121208

2012年12月8日 USP友の会勉強会 5

今日やること● 【重要】我々の会は、

アル中のリハビリ互助会ではない。

Page 6: Uspstudy20121208

2012年12月8日 USP友の会勉強会 6

今日やること

● 飲んでばっかりはあかん!– シェル芸で脳味噌デトックス

Page 7: Uspstudy20121208

2012年12月8日 USP友の会勉強会 7

シェル芸とは? (スライド再利用!)

● マウスも使わず、プログラムも書かず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・ファイル処理をコマンド入力一撃で終わらす。

※シェル芸人イメージ(麻雀は天和で終わらす)

Page 8: Uspstudy20121208

2012年12月8日 USP友の会勉強会 8

ということで(これも再利用)

● 端末操作だけでいろんな仕事をできるようになってもらいます。

– シェルスクリプト?そんな大げさなもんいらん。

– 今回の内容をおさえればクソ長いシェルスクリプトは書かなくなることでしょう・・・

– 今回はエディタすら使用禁止

Page 9: Uspstudy20121208

2012年12月8日 USP友の会勉強会 9

時間割

● ~18:30– 最後までワンライナー地獄

Page 10: Uspstudy20121208

2012年12月8日 USP友の会勉強会 10

問題の解き方

● 基本はbashかshで

● 使えるコマンドはなんでも使え– posixとか気にするのはできるようになってから!

● できる人はいろいろな方法で挑戦– それも終わったら他の人を指導

– 玄人勢の献身がこの勉強会を成功させます!

Page 11: Uspstudy20121208

2012年12月8日 USP友の会勉強会 11

問題1: 文字化けしたファイルの削除

● 次のように、空ファイル abc, DEFG と、文字化けした空ファイルを作ってください。

● 文字化けしたファイルを消してください。ただし、日本語の入力は禁止です。

Page 12: Uspstudy20121208

2012年12月8日 USP友の会勉強会 12

問題1: 答え

● シンプルな答え

– $ rm [!a-zA-Z]*

● 確認してから消す

– $ echo [!a-zA-Z]* | xargs rm

● ワイルドカードが思いつかない場合

– $ ls | grep '[^a-zA-Z]' | xargs rm

Page 13: Uspstudy20121208

2012年12月8日 USP友の会勉強会 13

問題2: 計算

● 以下のファイル中の数字を全部足し算してください。

Page 14: Uspstudy20121208

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

Page 15: Uspstudy20121208

2012年12月8日 USP友の会勉強会 15

問題3: 条件でデータを取り出し

● 右のhogeファイルから、aとbについてそれぞれ一番大きな数を求めましょう。

Page 16: Uspstudy20121208

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

Page 17: Uspstudy20121208

2012年12月8日 USP友の会勉強会 17

問題4: 計算

● 以下のファイル中の数字を、キー(a,b)ごとに全部足し算してください。

Page 18: Uspstudy20121208

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

Page 19: Uspstudy20121208

2012年12月8日 USP友の会勉強会 19

問題5: 日付と曜日

● 以下のようにファイルを作って、何曜日が何日あるか集計してください。

Page 20: Uspstudy20121208

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

Page 21: Uspstudy20121208

2012年12月8日 USP友の会勉強会 21

問題6: ダミーデータの作成

● seq 1 100 の出力をランダムに並び替えてください。

Page 22: Uspstudy20121208

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

Page 23: Uspstudy20121208

2012年12月8日 USP友の会勉強会 23

問題7: 検索● 大文字小文字を区別しない場合、以下の辞書ファイルから、

重複する単語を検索してください。

– asciiコード以外の字がありますが、とりあえず気にしないでください。

Page 24: Uspstudy20121208

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'

Page 25: Uspstudy20121208

2012年12月8日 USP友の会勉強会 25

問題8: ファイルの比較

● file2から、file1にない数字を抽出してください。

Page 26: Uspstudy20121208

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

Page 27: Uspstudy20121208

2012年12月8日 USP友の会勉強会 27

問題9: 形式変換

● 左のようなファイルを作り、右のように整形してください。

Page 28: Uspstudy20121208

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/\*/ /'

Page 29: Uspstudy20121208

2012年12月8日 USP友の会勉強会 29

問題10: ファイルの結合

● file1、file2 から、下の出力を得てください。

Page 30: Uspstudy20121208

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

Page 31: Uspstudy20121208

2012年12月8日 USP友の会勉強会 31

まとめ

● お疲れさまでした!!● 2月あたりにまたやりますよ。

● さあ、飲みにいきましょう。