第25回シェル芸勉強会に行ってきたので、その復習。
前半は結構簡単な内容だったのだが、後半がちょっと難しかった。

問題および模範回答はこちら

Q1

指定されたドメイン(www.usptomo.com)のIPアドレスのみを取得するという問題。
これは簡単で、digコマンド一発で取れる。

dig www.usptomo.com +short
blacknon@BS-PUB-UBUNTU-01:~$ dig www.usptomo.com +short
157.7.203.188

Q2

Q2は、前日Twitterではやってたシェル芸の言葉をちょっと変えたものだ。
なので、先日と同じように対応。

for i in {0..8}; do echo "ひらけ!ポンキッキ" | sed -E "s/^(.{$i})(.*)/\2\1/" ; done;
blacknon@BS-PUB-UBUNTU-01:~$ for i in {0..8}; do echo "ひらけ!ポンキッキ" | sed -E "s/^(.{$i})(.*)/\2\1/" ; done;
ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ

Q3

rbashの環境で、リダイレクトを使わずにファイルに書き出す、という問題。
手堅くteeコマンドを使うとちゃちゃっと解ける。

grep /bin/bash$ /etc/passwd | tee aaa

この問題については、別解をebanさんがいっぱい出してたのでそちらも参照するとよさそう。

Q4

ワンライナーで、"濁点のつくひらがなだけに"濁点をつけてやる、という問題。
Unicodeでは通常のひらがなと濁点付きは1個しかずれてないので、uninameを使ってなんとかできないかと思ってたのだけど駄目だった。

で、どうやってやるのかというとどうやらnkfを使って「半角カタカナへ変換」→「すべての文字に濁点を付与」→「すべてひらがなに」→「濁点だけの文字を削除」という処理をすればいいようだ。

ほかの人の回答を見つつ、自分なりに回答。
濁音はそのものではなくUnicodeを指定している。

echo すけふぇにんけん | nkf -h2 | nkf -Z4 | sed "s/\(.\)/&$(echo -ne '\uFF9E')/g" | nkf -h1 | sed "s/$(echo -ne '\u309B')//g"
blacknon@BS-PUB-UBUNTU-01:~$ # 一度全角カタカナにする
blacknon@BS-PUB-UBUNTU-01:~$ echo すけふぇにんけん | nkf -h2
スケフェニンケン
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 全角カタカナから半角カタカナへ変換
blacknon@BS-PUB-UBUNTU-01:~$ echo すけふぇにんけん | nkf -h2 | nkf -Z4
スケフェニンケン
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 全ての文字に半角カタカナの濁音を付与
blacknon@BS-PUB-UBUNTU-01:~$ echo すけふぇにんけん | nkf -h2 | nkf -Z4 | sed "s/\(.\)/&$(echo -ne '\uFF9E')/g"
ズゲブェ゙ニ゙ン゙ゲン゙
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # ひらがなに変換
blacknon@BS-PUB-UBUNTU-01:~$ echo すけふぇにんけん | nkf -h2 | nkf -Z4 | sed "s/\(.\)/&$(echo -ne '\uFF9E')/g" | nkf -h1
ずげぶぇ゛に゛ん゛げん゛
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # ひらがなの濁音を削除
blacknon@BS-PUB-UBUNTU-01:~$ echo すけふぇにんけん | nkf -h2 | nkf -Z4 | sed "s/\(.\)/&$(echo -ne '\uFF9E')/g" | nkf -h1 | sed "s/$(echo -ne '\u309B')//g"
ずげぶぇにんげん

Q5

ターミナル上で、1秒に1個「*」が増えていく処理をするというお題。
whileを使う方法が一般的だからそれ以外とのことだったので、yesでコマンドをテキストで出力して、それをshにパイプで渡す方法をとった。

Q6

ファイル内のテキストを読める状態にする問題。
base64を使う方法はTwitter上で一時期はやっていたので、違う方式になっているようだ。

で、どうやらリトルエンディアンのユニコードが書かれているようなので、一度読み込んだ後にnkfやiconvなどでUTF-8に変換してやればいいみたいだ。

cat crypt | xxd -r -p | iconv -f UTF-16LE -t UTF-8
blacknon@BS-PUB-UBUNTU-01:~/ShellGeiData/vol.25$ cat crypt | xxd -r -p | iconv -f UTF-16LE -t UTF-8
シェル芸

Q7

2016/10/29(シェル芸当日)の00:00:00~23:59:59までの範囲のUNIX時間で素数のものを計算するという問題。
UNIX時刻から普通の時刻に戻す必要がある。

とりあえず、以下のように解答した。

eval "echo {$(date -d '2016/10/29 00:00:00' +%s)..$(date -d '2016/10/29 23:59:59' +%s)}"|tr ' ' '\n'|factor|awk 'NF==2{print $2}'|xargs -I{} date --date @{}

Q8

コンソール上でサイン波を記述するという問題。
gnuplotなどを使えば簡単にかけるようだ。

その他の方法としては、ebanさんが頑張ってたのでそっちを見るとよさそう。
今回から新宿だったのだが、ちょっと道迷ってしまった…次は気を付けよう。