エンジニアなら知っておきたい!?個人的Macでよく使っているLinuxコマンド3選!

プログラミング
この記事は約8分で読めます。

最近急に冷え込んできて体調不良の方がちらほらいらっしゃいますがいかがお過ごしでしょうか?

仕事・プライベート共に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コマンドの紹介でしたが、これらはワンライナーシェルと呼ばれるものです。

プログラムを書ければエンジニアとしては働けます。

ただパソコンを使っている職業だからこそ、ファイルやディレクトリを操作したり、ファイルから何かを確認したり、もっと基礎的なところを効率化できるようになっておくべきだと思います。

またこれらのワンライナーシェルは最もシンプルなプログラミングだと思います。

大きい開発を経験するのも大事ですが「これを一発でやるにはどういったコマンドを繋げればいいだろうか」と考えるのも違う勉強になりますよ!

というわけで今回は以上です。

ここまで読んで頂きありがとうございました!

コメント

タイトルとURLをコピーしました