今日は初心者向け「第25回シェル芸勉強会 大阪サテライト」の記録
はじめに
10月29日(土)に開催された「第25回シェル芸勉強会 大阪サテライト」に参加しました。
今回は従来より開始時間が15分早くなりましたが、朝9時45分から夜18時まで従来通りsh行三昧の一日でした。
メイン会場および他サテライト会場
各会場の様子
- jus共催 第7回初心者の定義で大揉め午前のシェル勉強会/第25回もう4年もやってんのかシェル芸勉強会 - Togetterまとめ
- 「第25回シェル芸勉強会 大阪サテライト」レポート - くんすとの備忘録
- 第25回シェル芸勉強会へ遠隔参加 - 日々之迷歩
問題ならびに模範解答
ライブストリーム(YouTube)
午前の部: シェルに関する勉強会
man grep
- 講師: Ryuichi Ueda(@ryuichiueda)さん
grep
とは- 兄弟プログラム
egrep
とfgrep
- 様々なオプション
-E
: 拡張正規表現-F
: パターンを固定文字列として扱う-P
: Perl正規表現-e
: 複数パターン指定-f
: パターンをファイルから読み込む-i
: 大文字と小文字の区別を無視-v
: マッチしない行を表示-w
: 完全な単語とマッチした場合は表示-x
: 行全体とマッチした場合は表示-c
: マッチした行数を表示--color
: 色付きで表示-L
: マッチしないファイル名を表示-l
: マッチするファイル名を表示-m NUM
: マッチ行数がNUMに達したら中止-o
: マッチした部分ごとに改行して表示-q
: 何も出力せず、マッチの成否を終了ステータスにする- (…以下略…)
- 講師: Ryuichi Ueda(@ryuichiueda)さん
午後の部: シェル芸勉強会
- いずれの問題も、Debian 8「jessie」の32ビットPC版で解答しています。
- 使用OSによっては、
sort
を実行する言語環境をLANG=C
にする必要があるかも知れません。
Q1: IPアドレスだけ出力
$ ping -c1 www.usptomo.com | head -n1 | sed -r 's/^[^(]*//;s/\).*//;s/\(//'
157.7.203.188
ping
した結果からsed
で不要な部分を削除します。
Q2: すべての循環パターンを生成
$ echo ひらけ!ポンキッキ | sed -r ':;p;s/^(.)(.*)/\2\1/;b' | head -n9
ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ
sed
で文字列を1文字ずつ移動させる無限ループを実行し、head -n9
で最初の9行だけ出力します。
Q3: 制限付きシェル下でのファイル書込
$ rbash
[mitsuhisa@debian 第25回シェル芸勉強会]$ : > hoge
rbash: hoge: 制限されています: 出力をリダイレクト出来ません
$ grep '/bash$' /etc/passwd | sed 'w hoge'
root:x:0:0:root:/root:/bin/bash
mitsuhisa:x:1000:1000:KUSANAGI Mitsuhisa,,,:/home/mitsuhisa:/bin/bash
$ cat hoge
root:x:0:0:root:/root:/bin/bash
mitsuhisa:x:1000:1000:KUSANAGI Mitsuhisa,,,:/home/mitsuhisa:/bin/bash
bashをrbash
の名前で起動すると、
- リダイレクトが使えなくなる
bash
の環境変数の値を変更できなくなる
など、シェルには様々な制限がかかりますが、
sed
のw
コマンド
w filename
現在のパターンスペースを filename に書き込む。
でファイルに書き込むことができます。
Q4: 濁点がつく字だけに濁点をつける
当日に解答できなかった問題です。
$ echo すけふぇにんけん | nkf --katakana | nkf -Z4 | sed 's/./&゙/g' | nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげん
文字の変換には一般的にnkf
を使いますが、この問題を解くために次のオプションを使っています。
--katakana
: 片仮名に変換--hiragana
: 平仮名に変換-Z4
: 全角カナから半角カナに変換
濁点の処理はsed
で行っています。
Q5: アニメーション
訂正: 当日の解答は誤った解答であるため、次のようなワンライナーに訂正します。
$ while :; do echo -n '*'; sleep 1; done
**********^C
while :
でループを1回実行するごとに「*」が1つずつ増えていく無限ループを実行しています。
なお、ループの末尾ではsleep 1
を用いて処理を1秒間停止しています。
Q6: 文字列を復元
当日に解答できなかった問題です。
$ cat crypt
b730a730eb30b8820a00
$ echo -e $(cat crypt | sed -r 's/(..)(..)/\\u\2\1/g')
シェル芸
当日は、最後の「0a00」が改行文字(0x0a)とヌル文字(0x00)だと思い、そこから悪戦苦闘したところで時間切れとなりました。
実際は、バイトオーダーをリトルエンディアンにしたものということなので、sed
で各バイトを入れ替えてecho -e
で表示します。
nkf
のオプションで、入力コードとしてリトルエンディアンのUTF-16を仮定する-W16L
を用いた
$ cat crypt | xxd -p -r | nkf -W16L
シェル芸
という解法もあります。
Q7: UNIX時刻で素数になるものを世界標準時で表示
$ seq $(date -ud 2016-10-29 +%s) $(date -ud 2016-10-30 +%s) | sed '$d' | factor | awk 'NF==2{print $2}' | xargs -n1 -I% date -ud @%
2016年 10月 29日 土曜日 00:00:07 UTC
2016年 10月 29日 土曜日 00:00:13 UTC
2016年 10月 29日 土曜日 00:00:19 UTC
(...略...)
2016年 10月 29日 土曜日 23:59:17 UTC
2016年 10月 29日 土曜日 23:59:23 UTC
2016年 10月 29日 土曜日 23:59:43 UTC
基本的な解法は、
seq $(date -ud 2016-10-29 +%s) $(date -ud 2016-10-30 +%s) | sed '$d'
で、指定された日(2016年10月29日)の範囲に含まれるUNIX時刻を列挙factor | awk 'NF==2{print $2}'
で、素数だけを抽出xargs -n1 -I% date -ud @%
で、人間にとって読みやすい日付文字列にする
という手順になっています。
Q8: サイン波を描く
$ echo 'plot(X=-5,5,sin(X))' | gp -fq | sed '$d;s/^.\{10\}//' | sed "s/[\'\`.|]/ /g;s/[^ ]/*/g"
***** *****
* * **
* * *
* *
* *
* *
* *
*
* * *
*
* *
* *
*
* * *
*
* *
* *
* *
* *
* * *
** * *
***** *****
計算機代数システムPARI/GPのgp
にはプロット機能がありますが、解答に使うには不要な文字が多いのでsed
で掃除しています。
LT大会
- シェルスクリプトでGnuCashを使いやすく
- 発表者: 日柳 光久(@mikkun_jp)
- GnuCashは優れたフリーの会計ソフトだが、請求書のデザインが今ひとつ
- シェルスクリプトを作って解決
- 発表者: 日柳 光久(@mikkun_jp)
- バイナリをbase64してからgzipするとファイルサイズは小さくなるのか??????
- 発表者: くんすと(@kunst1080)さん
gzip
について、テキストは圧縮率が高い- バイナリを
base64
でテキストにした場合はどうなるか - 「hello worldプログラム」のソースおよびバイナリ、そして画像でも検証
base64
の際に情報量が増えるので、gzip
してもその分だけサイズは増えるbase64
しない方が軽い
- 発表者: くんすと(@kunst1080)さん
- アスキーアートワンライナー
※延長戦含む- 発表者: MSR(@msr386)さん
- いわゆる「突然の死」をワンライナーで実装
sl
をワンライナーで実装- ターミナル画面をワンライナーでぐちゃぐちゃにする(延長戦)
- 発表者: MSR(@msr386)さん
- パイプを通るPDF
※詳細: パイプを通るPDF(実験中) 〜 #シェル芸 の新たなる境地へ- 発表者: T.Motooka(@t_motooka)さん
convert xc:none -page A4 pdf:-
で中身が空のPDFを生成し、標準出力に送ることができる- その後、
gs
や他のコマンドで何かできないか?
- 発表者: T.Motooka(@t_motooka)さん
- tmuxチートシート
- 発表者: nmrmsys(@nmrmsys)さん
- コマンドライン指定(
tmux kill-server
でtmux全体を終了、など) - キー操作(
?
でキーバインド一覧、]
でコピーした内容を貼り付け、など) - 設定エトセトラ(
set-option -g mouse on
でマウス操作を有効にする、など)
- コマンドライン指定(
- 発表者: nmrmsys(@nmrmsys)さん
おわりに
午前の部では、CLIでよくお世話になっているgrep
のオプションを学び直すことができました。特に、空白や改行文字を含むような行儀の悪いファイル名に対応するための-Z
オプションや-z
オプションは、これからのシェル芸に役立ちそうです。
午後の部は、パズル的な問題が出され、CLIにまつわる総合的な知識を要求されることになりました。文字列を復元するQ6は、まるでCTFの問題のようでした。
ちなみに、LT大会では初めてスライドというものを作りましたが、Markdown記法でスライドが簡単に作成できるMarp、おすすめの逸品です。
最後に、
- 大阪サテライトの主催をされている、くんすと(@kunst1080)さん
- 大阪サテライト会場を提供してくださっている、フェンリル株式会社 大阪本社様
- Ryuichi Ueda(@ryuichiueda)さんをはじめとする、メイン会場スタッフの皆さん
に改めてお礼を申し上げます。ありがとうございました。