ちょっとマイナーだけど便利なコマンドオプション

  • 17
    Like
  • 0
    Comment

はじめに

本記事では、誰もが知ってるというほどではないけれども知ってると便利、くらいの位置にあるlinuxのコマンドオプションをランダムに羅列します。取り扱うコマンドはdockerやgitなどの新しめなものではなく、grepなどの古くから存在するコマンドたちです。たまにオプションではないものも入っていますが、それはご愛嬌。

対象読者はshell芸のエキスパートではなくshellユーザの初中級者くらいです。

grep: マッチした行の前後数行を表示

-B, -A, -Cで、それぞれマッチした行の前n行、後n行、前後n行を表示します。検索にマッチした行付近の文脈を知りたいような場合に便利です。

tar: 展開には圧縮形式の指定は不要

若干古めの教科書的な書籍だとtar.[gbx]zファイルはtar [zjJ]xfで展開する、というように書いていますが、実はどれも tar xfだけで展開できます。拡張子が[gbx]zじゃなくても勝手に中身を解析してくれます(あまりないケースでしょうが)。

top: 結果を標準出力に

今現在リソースを食っているプロセスを知りたいがためにtopを実行して確認後、すぐにqで終了させたりしていないでしょうか。top -b -n 1を使えば、一回ぶんのデータだけ標準出力に表示して即座に終了できます。他にもtop -b -d 5 -n 3とすると5秒ごとに3回データをとるなど、細かい指定ができます。

sed: 正規表現を使ったファイルコンテンツの置換

-iオプションを使うとsedで得られた出力でもとのファイルを置換できます。

以下、あるファイルの内容を正規表現を使って置換しようとした場合の、初心者のやりがちな失敗例。

$ cat test
foo
bar
hoge
$ sed s/foo/FOO/ test >test
sat@glenda:~/practice/misc
$ 
            # 全部消えた、ギャー!

-iオプションを使えば次のようにうまくいきます。

$ cat test
foo
bar
hoge
$ sed -i s/foo/FOO/ test
$ cat test
FOO
bar
hoge
$ 

less: tail -fのようなことをする

lessの実行中に、ファイルの末尾に居るときに"F"を押すと、その先をさらに読み込もうとします(^Cで中断可能)。これはtail -fの挙動と似ています。どんどん内容が追加されるログファイルを読むような時に便利です。中断後に再びファイルの末尾以前の部分を参照できるので、tail -fより若干使い勝手が良いです。

time: リッチな出力

多くの人は普段bashをお使いだと思います。この場合timeコマンドを実行するとデフォルトでは/usr/bin/timeではなくbashの組み込みコマンドtimeが使われます。

以下、bashのtime組み込みコマンドの実行例。

$ time echo hello >/dev/null

real    0m0.000s
user    0m0.000s
sys     0m0.000s
$ 

以下、/usr/bin/timeの実行例(¥timeとすることによって、組み込みコマンドを使わないようにできます)。

$ \time echo hello >/dev/null
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 1192maxresident)k
0inputs+0outputs (0major+63minor)pagefaults 0swaps
$ 

見ての通りユーザプログラムそのものによる実行時間(user)、カーネルの実行時間(system)、経過時間(elapsed。組込みコマンドでいうところのreal)に加えてページフォルトの数など、かなり細かいデータを採取できます。こちらの出力を見たことがないというかたも相当数おられるのではないでしょうか。

表示するデータは--formatオプションによって制御可能です。興味のあるかたはman time(1)をごらんください。

おわりに

「こんなの誰でも知ってるだろう、どこがマイナーなんだよバーカ」というような意見は多々あると思いますが、あくまで筆者の観点で選んだものだと思ってご勘弁ください。またネタを思い出したら適宜追加していきます。