のこのこかずのこ

10年エンジニアやってるけどいまだになんもわからん

技術書読んだメモ:シェル・ワンライナー160本ノック

少し前にこちらの本を拝読しました。

読もうと思ったわけ

サーバーを触ることはあるので、基本的なコマンド操作はできるのですが、|とか>とか&とかが出てくる長めのコマンドになると「何か分からん…とりあえずコピペ……」状態になってしまう自分を少しでも変えたいと思ったので手に取ってみました。あと、ちょっとした操作をシェルスクリプトで自動化できる同僚がかっこいいな〜と思っていたからです。

結果

本の題名には「半年以内に習得」と書いてありますが、私は約4ヶ月で読み切ることができました。一日、少ない日は0ですが多い日は10個くらいをまとめて進めました。セクションが細かく分かれているので、「とりあえず一つだけやろう…」という低いハードルで初めてけっきょく3つくらいできちゃったり、モチベーションを保ちやすかったです。私は、問題を読んで→1分くらい一応考えて→分からなかったら解説を読みながらコマンドを真似て打ってみて納得する、という感じで1問20~30分で終わらせるようにしました。(そうしないと、途中で挫折しそうで…。)自分で考えながら進めた場合は、もっとたくさん時間がかかると思います。解説が丁寧で、痒いところに手が届く感じだったので、本に書いてある内容だけでほぼ理解できました。

読んでみた感想

awksedがすごい

この本を読むまでは存在すら知らなかったawksedだけで大体のことが解決できると知れてよかったです。8割くらいawksedなのでは…!?世の問題のほとんどは「入力に対して、加工して、出力する」なのでawksedが有効、という点を実感として得られました。膨大なコマンドを覚える必要はない、という気づきでシェルに対するハードルが下がりました。

Macユーザーはつまづきポイントが多いかも

私はMacでコマンドを実行していたのですが、本はLinuxを前提で書かれているので、たまに動かないことがありました。最初は諦めていたのですが、そのうちMacBSD系で、LinuxGNU系なのでコマンドの挙動が異なるということを知りました。

この辺りのGNU系をインストールしたと思います。

brew install coreutils    # gdateなど
brew install grep         # ggrep
brew install gawk         # gawk
brew install gnu-sed      # gsed

本の通りに動かない時は、とりあえずコマンドの先頭にgをつけてみると動く!ことが多かったです。これが分かってから捗るようになりました。

あと、システムのファイルを使う際にもどうしてもファイル構成が異なってしまうので、Dockerで簡易的なUbuntu環境を作ってその中でコマンド実行をしたりしました。

docker pull queeno/ubuntu-desktop
docker run -itd -p 5901:5901 --name ubuntu-desktop --hostname ubuntu:remote queeno/ubuntu-desktop
docker exec -it ubuntu-desktop /bin/bash    # Docker内に入る 
シェルがちょっと好きになった

一番よかったのは、毎日のようにひたすらコマンドを打つことで、コマンドを恐れる気持ちがなくなったことです。そして、シェルを愛する人々はこういう問題に日々取り組んでいるのか〜という今まで知らなかった世界を垣間見れたことも面白かったです。奥深い世界なんだなと思います。パズルのような感覚で、頭の体操にもなりました。

この本を読んだことで、じゃあ業務の様々なことを自動化できるようになったか?というと残念ながら私はその域には達せていないと思います…。実用性を求めるのであれば、ワンライナーではなく、シェルスクリプトを書く練習をした方がいいと思いますし。しかし、シェルに関する基礎的な知識を学んで、数をこなして慣れたことで、日常でコマンドを使う頻度は多くなりましたし、機会があればシェルスクリプトも書いてみようという気持ちになりました!読んでよかったです。