はじめに

ps -ef | grepを行うと、psのヘッダが出てくれない。
ヘッダを出す方法は主に2通りで、ps -efに head -1 を付けるか、grepのかわりに ps -f -C cmdlist を使うか。
head -1を付ける方法自体も2通りあるので、合計3通りの書き方がある。

head -1を付ける方法その1

ps -ef | head -n 1と本来書きたかったps -ef | grep;でつなげて書く。

$ ps -ef | head -n 1; ps -ef | grep python;
UID PID PPID C STIME TTY TIME CMD
user 2374 2365 0 00:16 ? 00:00:00 python /usr/share/ibus/ui/gtk/main.py
user 2382 2365 0 00:16 ? 00:00:00 python /usr/share/ibus-anthy/engine/main.py --ibus
user 3063 2483 0 00:34 pts/1 00:00:00 grep python

head -1を付ける方法その2

方法その1だとps -efを二度書かなければならない。
グループコマンド(group command) とよばれる{ }を利用すれば、ps -efを1度だけ書けばいい。
グループコマンドはリストとの間が空白またはシェルのメタ文字で分かれている必要がある。

$ ps -ef | { head -n 1; grep python; }
UID PID PPID C STIME TTY TIME CMD
user 2374 2365 0 00:16 ? 00:00:00 python /usr/share/ibus/ui/gtk/main.py
user 2382 2365 0 00:16 ? 00:00:00 python /usr/share/ibus-anthy/engine/main.py --ibus

そして、方法その2にはもう一つメリットがある。
通常ps -ef | grep XXを行うと、標準出力に自分自身(つまりgrep XX)が表示されてしまう。
何度か実行したが、グループコマンドを利用すると、ps -ef | grep の結果に自分自身は表示されなかった。

grepのかわりにps -f -C cmdlistを使う方法

実はps -ef | grepと同等の機能が、grepを使わずにpsのオプションだけで実現できる。
そもそもps -ef | grepを行うとヘッダが表示されない原因はヘッダの文字列がgrepの正規表現に合致しないためなので、grepを使わずにpsだけで実現できれば、ヘッダも表示されたままである。
ただしgrepはコマンドの引数もマッチの対象にできるため、grepの方が柔軟ではある。

$ ps -f -C cmdlist

※全て表示を示す-eはつけない。

例:

$ ps -f -C python
UID PID PPID C STIME TTY TIME CMD
user 2374 2365 0 00:16 ? 00:00:00 python /usr/share/ibus/ui/gtk/main.py
user 2382 2365 0 00:16 ? 00:00:00 python /usr/share/ibus-anthy/engine/main.py --ibus

またps -f -U userlist等も同様の使い方ができるが、psのオプションは条件がorでつながっていくので、-C-Uを同時に指定はできない。
柔軟さを求めるならgrepで正規表現等を使うのが一番いい。