【問題と解答】第25回もう4年もやってんのかシェル芸勉強会
Sat Oct 29 15:58:13 JST 2016 (modified: Sat Dec 14 18:59:56 JST 2019)
views: 3560, keywords:コマンド,勉強会,シェル芸 この記事は最終更新日が6年以上前のものです。
イントロ
問題で使うファイル等
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.188Q2
次のような出力を作ってください。(出典)
ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ解答
ベタなものを載せておきます。変態的解答はウェブで。
$ a="ひらけ!ポンキッキ" ; for i in $(seq 2 $(wc -m <<< $a)) ;
do echo $a ; a=$(sed 's/\\(.\\)\\(.*\\)/\\2\\1/g' <<< $a) ; doneQ3
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=hoheQ4
以下のひらがなからワンライナーを始めて、濁点がつく字だけに濁点をつけてみてください。
$ echo すけふぇにんけん解答
$ echo すけふぇにんけん | sed 's/./&゛/g'
| nkf --katakana | nkf -Z4
| nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげんQ5
1秒に一つ*が伸びていくアニメーションを作ってください。
某ムービー pic.twitter.com/WEEFCanxsf
— 上田 隆一 (@ryuichiueda) December 14, 2019
解答
$ 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
次のようにサイン波を描いてください。
解答
$ 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 @ ' ' 
ノート
Tweet