【問題と解答】第25回もう4年もやってんのかシェル芸勉強会

Pocket
LINEで送る

イントロ

こちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.25

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

今回はUbuntu Linux 16.04で解答例を作りました。

Q1

www.usptomo.comのIPアドレスだけを出力するワンライナーを考えてみてください。

解答

$ dig www.usptomo.com | grep -A1 ANSWER 
| tail -n 1 | awk '{print $NF}'
157.7.203.188
$ ping -c1 www.usptomo.com | head -n 1 
| awk '{print $3}' | tr -d '()'
157.7.203.188

Q2

次のような出力を作ってください。(出典

ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ

解答

ベタなものを載せておきます。変態的解答はウェブで。

$ a="ひらけ!ポンキッキ" ; for i in $(seq 2 $(wc -m <<< $a)) ; 
do echo $a ; a=$(sed 's/\(.\)\(.*\)/\2\1/g' <<< $a) ; done

Q3

rbashと打つとリダイレクトが使えなくなります。

この状況で、/etc/passwdからbashをログインシェルにしているユーザのレコードを抽出し、hoge等のファイルに出力してみましょう。様々な方法を考えてみましょう。bashと打ったりexitでもとのbashに戻るのは反則とします。

解答

$ grep bash$ /etc/passwd | tee hoge
$ grep bash$ /etc/passwd | awk '{print $0 > "huge"}'
$ grep bash$ /etc/passwd | dd of=hohe

Q4

以下のひらがなからワンライナーを始めて、濁点がつく字だけに濁点をつけてみてください。

$ echo すけふぇにんけん

解答

$ echo すけふぇにんけん | sed 's/./&゛/g' 
| nkf --katakana | nkf -Z4 
| nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげん

Q5

1秒に一つ*が伸びていくアニメーションを作ってください。

解答

$ yes | awk 'BEGIN{a="*"}{print a;a=a"*";system("sleep 1")}' 
| xargs -I@ echo -ne @"\r" 

Q6

日本語のメッセージから作った次の文字列を復元してください。

$ cat crypt 
b730a730eb30b8820a00

解答

0a00あたりがカギになります。

$ cat crypt | xxd -ps -r | iconv -f=ucs-2le -t=utf8
シェル芸
$ echo -ne $(sed 's/\(..\)\(..\)/\\U\2\1/g' < crypt)
シェル芸

Q7

本日(2016年10月29日)の範囲の毎秒のUNIX時刻で素数となるものを全て列挙してください。出力はUNIX時刻でなく、何時何分何秒か分かるようにしましょう。世界標準時で考えてください。

解答

$ ( date -ud '20161029' +%s ; date -ud '20161030' +%s ) | xargs seq 
| factor | awk 'NF==2{print "@"$2}' | date -uf - 

Q8

次のようにサイン波を描いてください。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-27-21-04-17

解答

$ seq 1 20 | awk '{a=sin($1/3) * 10 + 10;for(i=0;i<a;i++)printf "@ ";
printf "* ";for(i=a;i<20;i++)printf "@ ";print ""}' 
| rs -t 23 | tr @ ' ' 
Pocket
LINEで送る