第25回シェル芸勉強会に行ってきたので、その復習。
前半は結構簡単な内容だったのだが、後半がちょっと難しかった。
問題および模範回答はこちら。
Q1
指定されたドメイン(www.usptomo.com)のIPアドレスのみを取得するという問題。
これは簡単で、digコマンド一発で取れる。
Q1
最初だし
dig https://t.co/HuE5YWk5Kl +short
#シェル芸— Blacknon(エビス) (@blacknon_) 2016年10月29日
dig www.usptomo.com +short
blacknon@BS-PUB-UBUNTU-01:~$ dig www.usptomo.com +short
157.7.203.188
Q2
Q2は、前日Twitterではやってたシェル芸の言葉をちょっと変えたものだ。
なので、先日と同じように対応。
Q2
先日と同じで
for i in {0..8}; do echo "ひらけ!ポンキッキ" | sed -E "s/^(.{$i})(.*)/\2\1/" ; done;— Blacknon(エビス) (@blacknon_) 2016年10月29日
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コマンドを使うとちゃちゃっと解ける。
Q2
grep /bin/bash$ /etc/passwd | tee aaa #シェル芸— Blacknon(エビス) (@blacknon_) 2016年10月29日
grep /bin/bash$ /etc/passwd | tee aaa
この問題については、別解をebanさんがいっぱい出してたのでそちらも参照するとよさそう。
Q4
ワンライナーで、"濁点のつくひらがなだけに"濁点をつけてやる、という問題。
Unicodeでは通常のひらがなと濁点付きは1個しかずれてないので、uninameを使ってなんとかできないかと思ってたのだけど駄目だった。
で、どうやってやるのかというとどうやらnkfを使って「半角カタカナへ変換」→「すべての文字に濁点を付与」→「すべてひらがなに」→「濁点だけの文字を削除」という処理をすればいいようだ。
Q...なんだっけ?
echo すけふぇにんけん | nkf --katakana | nkf -Z4 | sed "s/\(.\)/\1゙/g" | nkf -X --hiragana | sed "s/゛//g" #シェル芸— ペンギン使いの初級魔術師。インフラ担当 (@neunetneucom) 2016年10月29日
nkfのオプションがわからなすぎる
Q4 $ echo すけふぇにんけん | sed 's/./&゛/g' | nkf -h2 | nkf -Z4 | nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげん#シェル芸— eban (@eban) 2016年10月29日
ほかの人の回答を見つつ、自分なりに回答。
濁音はそのものではなく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にパイプで渡す方法をとった。
yes "echo -n '*';sleep 1" | sh
#シェル芸— Blacknon(エビス) (@blacknon_) 2016年10月29日
Q6
ファイル内のテキストを読める状態にする問題。
base64を使う方法はTwitter上で一時期はやっていたので、違う方式になっているようだ。
で、どうやらリトルエンディアンのユニコードが書かれているようなので、一度読み込んだ後にnkfやiconvなどでUTF-8に変換してやればいいみたいだ。
Q6
$ cat crypt | xxd -r -p | iconv -f UTF-16LE -t UTF-8
リトルエンディアンだったのか #シェル芸— MSR (@msr386) 2016年10月29日
cat crypt | xxd -r -p | nkf -W16L #シェル芸
— Masaki Waga (@MasWag) 2016年10月29日
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 00:00:00 +%s)..$(date -d 23:59:59 +%s)}"|tr ' ' '\n'|factor|awk 'NF==2{print $2}'|xargs -I{} date --date @{}
#シェル芸— Blacknon(エビス) (@blacknon_) 2016年10月29日
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などを使えば簡単にかけるようだ。
$ gnuplot (echo -e 'set terminal dumb\nplot sin(x)')#シェル芸 pic.twitter.com/lDV55l3xf8
— むっつー (@mutz0623) 2016年10月29日
echo 'plot(X=-10,10,sin(X))' | gp -fq | sed '$d;s/^.\{10\}//' | sed "s/[\'\`.|]/ /g;s/[^ ]/*/g"
だとこんな感じ#シェル芸 pic.twitter.com/cIdB4KoMzy— 日柳 光久 (@mikkun_jp) 2016年10月29日
その他の方法としては、ebanさんが頑張ってたのでそっちを見るとよさそう。
今回から新宿だったのだが、ちょっと道迷ってしまった…次は気を付けよう。