今更ながら Software Design 2017年1月号 の「シェル30本ノック」に触れる機会がありました。社内勉強会の題材として。
- ノックそのままはかなり癖がある
- 少なくとも一般的なWeb開発者に求められるのはほぼ一部
- タイムボックスが30分
という理由から、設問を社内向けにアレンジして利用しました。
元の著作権に引っかからない範囲で、出題意図や、参加した3チームから出た回答をシェアしたいと思います。
なぜWebの会社でシェル?
Web屋さんですが、サーバはAmazon LinuxのEC2ですし、故障対応時などはsshログインしてlinuxコマンドを叩きます。ログインシェルはbashです。
プロセスの起動状況を確認したり、アクセスログの集計をしたり、利用するシーンが少なくないので、この機会にちょっと頭を捻ってみても良いかな?と思いました次第。
実際の問題
Q1
設問
これはノックのものをそのまま使いました。問題が気になる方はぜひ実際の書籍を読んでみてください。
各チーム回答集
# team 1
cat files.txt | grep -E "\.exe$"
# team 1 別解
cat files.txt | grep "\.exe$"
# team 2
grep "\.exe$" files.txt
# team 3
grep -E ".*\.exe$" files.txt
環境はかなり古いamazon linuxから立ち上げているsandboxを利用しています。
4つの回答がどれも一致しないのが面白いなと個人的には感じました。grepするときに、まず前段にcatを挟む人、-Eの有無など。このあたり、パッケージのディストリビューションによっても挙動が変わったりするので、面白いところです。
Q2
設問
ファイルからの設定の抽出
sandboxサーバのhostsに記載されているホスト名のうち
「db」が含まれているホスト名を列挙する
コメントアウトされている行は除く
各チーム回答集
# team 1
cat /etc/hosts | grep "db" | grep -v -E "^#" | awk '{print $2}'
# team 2
grep "db" hosts | grep -v '^#' | awk '{print $2}'
# team 3 - 設問読み違え
grep -E "^[^#].*db" /etc/hosts
team1とteam2はgrepの癖こそあるものの、ほぼほぼ同じ結果となりました。
面白いのはteam3で「ホスト名だけを抜く」という問題文こそ見落としましたが、コメントアウト行を除くという条件も最初のgrepに含めているところがほかの2チームと違うところ。
あと2問ありましたので、また次の更新で追記します。