■「第10回シェル芸勉強会」を解いてみた。 【本番資料】第10回シェル芸勉強会 http://blog.ueda.asia/?p=2378 Q1. 次の数字の列を足し算してください。(できる人はなるべく変態的に) $ echo 2 5 9 8 1 3 7 4 2 5 9 8 1 3 7 4 ■普通にシンプルに。 $ echo 2 5 9 8 1 3 7 4 | sed s/" "/"+"/g | echo $((`xargs`)) 39 Q2. スペースと数字と改行を使って次のようなファイルを作り、 書いた数を足し算してください。 $ cat num 1 2 3 4 5 6 7 8 9 ■Q1と同じ。 $ cat num | sed s/" "/"+"/g | echo $((`xargs`)) 45 Q3. 文字数を数えてください。改行記号は数えないでください。 $ cat genkou 筆者は朝、目玉焼きを食べた。 昼、著者は卵がけごはんを食べた。 そして夜、著者はマンハッタンの夜景を 見ながらゆで玉子を食べた。 ■行に変換 $ sed s/./"&\n"/g genkou | grep -v "^\$" | wc -l 61 Q4. 次のようなファイルを作り、ファイルの中に三個存在する文字を出力してください。 $ cat hoge aabbcdabbcccdd ■行に変換、wcの結果を使う。 $ sed s/./"&\n"/g hoge | sort | uniq -c | awk '($1==3){print $2}' a d Q5. 次のようなファイル、ディレクトリを作ってください。 そして、file1, file2, file3をカレントディレクトリに移動してください。 $ mkdir -p a/b/c $ touch a/file1 a/b/file2 a/b/c/file3 $ tree . └── a ├── b │ ├── c │ │ └── file3 │ └── file2 └── file1 3 directories, 3 files ■mv前に「`xargs`」を外して確認しましょう。 $ find a -name "file*" | \ for list in `xargs`;do \ echo "$list" | awk -F\/ '{print "mv "$0" "$NF}' | `xargs`; \ done Q6. 次のようにファイルとディレクトリを作り、 hogeと書いてあるファイルをディレクトリa、 それ以外のファイルをディレクトリbに振り分けてください。 $ echo hoge > file1 $ echo huge > file2 $ echo hoge > file3 $ echo hoge > file4 $ mkdir a b ■普通の分岐。 $ for list in file[0-9];do \ grep hoge "$list" > /dev/null 2>&1 && mv "$list" a/ || mv "$list" b/; \ done $ tree . ├── a │ ├── file1 │ ├── file3 │ └── file4 └── b └── file2 2 directories, 4 files Q7. 以下の9つのファイルについて、二つのファイルの組み合わせを 全て列挙してください。ただし、重複してはいけません。 $ touch file{1..9} $ ls file{1..9} file1 file2 file3 file4 file5 file6 file7 file8 file9 ■ファイルの作成が要らなかった。。。 $ for n in `seq 1 9`;do \ for m in `seq 9 -1 $n`;do \ if [ $m -ne $n ];then echo "file$n file$m";fi; \ done; \ done | sort -n file1 file2 file1 file3 file1 file4 file1 file5 file1 file6 file1 file7 file1 file8 file1 file9 file2 file3 file2 file4 file2 file5 file2 file6 file2 file7 file2 file8 file2 file9 file3 file4 file3 file5 file3 file6 file3 file7 file3 file8 file3 file9 file4 file5 file4 file6 file4 file7 file4 file8 file4 file9 file5 file6 file5 file7 file5 file8 file5 file9 file6 file7 file6 file8 file6 file9 file7 file8 file7 file9 file8 file9 Q8. 0から999999までの数字の一様乱数を無限に出力し続けてください。 ■awkは桁揃えのために。 $ while true;do \ dd if=/dev/urandom count=10 bs=512 2>/dev/null | \ tr -d -c '0-9' | cut -c 1-6 | \ awk '{printf "%6d\n",$0}'; \ done 276993 750541 780016 84374 894990 780357 136490 ...