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

Sat Oct 29 15:58:13 JST 2016 (modified: Sat Dec 14 18:59:56 JST 2019)
views: 2390, 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秒に一つ*が伸びていくアニメーションを作ってください。

解答

$ 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 @ ' ' 
ノート   このエントリーをはてなブックマークに追加 
 

prev:【問題のみ】第25回もう4年もやってんのかシェル芸勉強会 next:第25回もう4年もやってんのかシェル芸勉強会リンク集

やり散らかし一覧

記事いろいろ