【問題と解答】第25回もう4年もやってんのかシェル芸勉強会
Sat Oct 29 15:58:13 JST 2016 (modified: Sat Dec 14 18:59:56 JST 2019)
views: 2740, keywords:コマンド,勉強会,シェル芸 この記事は最終更新日が4年以上前のものです。
イントロ
問題で使うファイル等
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秒に一つ*が伸びていくアニメーションを作ってください。
某ムービー 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 @ ' '