最近急に冷え込んできて体調不良の方がちらほらいらっしゃいますがいかがお過ごしでしょうか?
仕事・プライベート共にMacを使っているのですが、今回はよく使っているけどあまり使われてないかな?と思ったコマンドを紹介していこうと思います!
grep
1発目からそこそこ有名なコマンドになりますが、grepコマンドです。
grepには2つの使い道があります。
ファイル内検索としてのgrep
有名なのはこちらの機能かと思います。
$ grep 検索正規表現 ファイル名
でファイルから特定の文字列を抽出できます。
$ cat ~/sample
あのイーハトーヴォのすきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
$ grep '森' ~/sample
うつくしい森で飾られたモリーオ市、
ファイルを再帰的に検索も出来るので、使い道としては
- デバッグログの消し忘れがないかを探す
- 変数などが変更した時に漏れがないかを探す
などによく使います。
ただ最近のエディタにはそういった検索機能がしっかり存在しているので実のところこの用途でgrepはあまり使っていません。。
主に使っているのは次の機能です。
パイプ『|』を使い標準出力の結果をフィルタリングするgrep
grepには検索機能がありますが、標準出力に関しての結果をフィルタリングすることが出来ます。
標準出力とは、ターミナル等の画面に結果として出てくる文字列になります。
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/LaraDock-ToolBox remotes/origin/bestlong-patch-1 remotes/origin/compose-v2 remotes/origin/framework remotes/origin/gh-pages remotes/origin/master remotes/origin/tagging-base-images
例えば git branchで ブランチ名を確認したい場合、↑の例ではブランチ名を探すのに時間は掛かりませんが、作業ブランチが増えて何十ものブランチになると探すのが大変です。
そのため パイプ『|』と grep を併用して標準出力の結果をフィルタリングします。
$ git branch -a | grep master * master remotes/origin/HEAD -> origin/master remotes/origin/master
これで大分探しやすくなりました。
git branch 以外にも ls コマンド や ps aux コマンドなど、大量の標準出力が表示されるコマンドは沢山あるのでgrepはかなり使用します。
このように grep を使うことで、視認性があがることで効率よく仕事を進められます!
xargs
意外と使われていない気がする xargs コマンド。
実際このコマンドは何をするかと言いますと、
パイプ『|』の結果を次のコマンドの引数として送るコマンドになります。
ピンと来ないと思いますので実際に実行してみます
例えばこのような環境があるとします。
$ git branch compose-v2 framework framework2 framework3 framework4 framework5 * master
そこで 『framework』 で grep を掛けたブランチの結果をパイプ『|』を使い git branch -D に送ります。
$ git branch | grep framework | xargs git branch -D Deleted branch framework (was 46107f3). Deleted branch framework2 (was 46107f3). Deleted branch framework3 (was 46107f3). Deleted branch framework4 (was 46107f3). Deleted branch framework5 (was 46107f3). $ git branch compose-v2 * master
本来であれば git branch -D [ブランチ名] でブランチを削除するのですが、xargsを使うことで [ブランチ名] にパイプの結果を転送して纏めて実行することが出来ます。
ひとつひとつコピペして削除するよりもずっとスマートです。
awk ‘{print $n}’
最後に awk コマンドです。
awkコマンドは今の僕では説明できないほど機能があるため今回は表題の1つだけの紹介になります。
こちらもパイプ『|』を使った時の話ですが awk ‘{print $n}’ で空白で区切られた文字列の n番目 の単語を表示します。
また例を上げると以下のような出力があるとします。
$ls -l
drwxr-xr-x 6 suzuki wheel 192 9 15 18:02 DOCUMENTATION
-rw-r--r-- 1 suzuki wheel 1077 9 14 12:11 LICENSE
-rw-r--r-- 1 suzuki wheel 23110 9 15 18:02 README-zh.md
-rw-r--r-- 1 suzuki wheel 17708 9 15 18:02 README.md
-rw-r--r-- 1 suzuki wheel 0 9 15 18:02 a
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 adminer
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 aerospike
drwxr-xr-x 5 suzuki wheel 160 9 15 18:02 apache2
drwxr-xr-x 4 suzuki wheel 128 9 15 18:02 aws-eb-cli
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 beanstalkd
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 beanstalkd-console
drwxr-xr-x 4 suzuki wheel 128 9 15 18:02 caddy
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 cassandra
drwxr-xr-x 5 suzuki wheel 160 9 15 18:02 certbot
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 couchdb
-rw-r--r-- 1 suzuki wheel 108 9 15 18:02 docker-compose.sync.yml
-rw-r--r-- 1 suzuki wheel 53394 9 15 18:02 docker-compose.yml
drwxr-xr-x 3 suzuki wheel 96 9 15 18:02 docker-registry
例えばこの中から「ファイル名だけを取得したい」ということがあれば、
$ ls -l | awk '{print $9}'
DOCUMENTATION
LICENSE
README-zh.md
README.md
a
adminer
aerospike
apache2
aws-eb-cli
beanstalkd
beanstalkd-console
caddy
cassandra
certbot
couchdb
docker-compose.sync.yml
docker-compose.yml
docker-registry
というように名前だけ抽出することができます。
cutコマンドでも同様のことが出来ますが、オプションを覚えられないためこちらを使うことが圧倒的に多いです。
これらが使えるようになると
今回紹介した3つのコマンドは、ワンライナーシェルという1行で複雑な処理を行えるおまじないを構成するものです。
例えば今回紹介した3つを組み合わせることで、
# 権限が drwxr-xr-x のファイルを全て削除
$ ls -l | grep 'drwxr-xr-x' | awk '{print $9}' | xargs rm -rf
# Merge済みのブランチをまとめて削除
$ git branch --merged | grep -v '*' | xargs git branch -D
# 実行中のシェルスクリプトを強制的に停止する
$ ps aux | grep *.sh | awk '{ print $2 }' | xargs kill
などなど多くのことが出来ることが出来ます。
このコマンドをどこかにメモしておくだけで作業がグッと楽にそして早く出来るようになります。
まとめ
今回はLinuxコマンドの紹介でしたが、これらはワンライナーシェルと呼ばれるものです。
プログラムを書ければエンジニアとしては働けます。
ただパソコンを使っている職業だからこそ、ファイルやディレクトリを操作したり、ファイルから何かを確認したり、もっと基礎的なところを効率化できるようになっておくべきだと思います。
またこれらのワンライナーシェルは最もシンプルなプログラミングだと思います。
大きい開発を経験するのも大事ですが「これを一発でやるにはどういったコマンドを繋げればいいだろうか」と考えるのも違う勉強になりますよ!
というわけで今回は以上です。
ここまで読んで頂きありがとうございました!
コメント