psコマンドの結果からプロセスIDを取得するときはcutではなくawkを使う

cutとawkの違いを読み間違えた件について、懺悔というか反省文。


目的:
以下の出力結果からpsコマンドのプロセスID(1234)を取得したい。

$ ps -ef | head -n 3
UID        PID  PPID  C STIME TTY          TIME CMD
myokoym   1234     0  0 12:34 pts/0    00:00:00 ps -ef
myokoym 999999     0  0 12:34 pts/0    00:00:00 head


手順:
該当行をgrepコマンドで抽出し、スペース区切りで2番目のフィールド(カラム)を取得する。

cutの場合

最初はcutを使ってみます。

$ ps -ef | head -n 3 | grep "ps -ef" | cut -d" " -f2

何も出力されません。試しにheadのプロセスIDを取得すると、

$ ps -ef | head -n 3 | grep "head" | cut -d" " -f2
999999

こちらは取れました。どうも、cutだとスペースが連続する場合に上手く取れない様子。スペースの数だけフィールド数が増えてしまっています。

$ ps -ef | head -n 3 | grep "ps -ef" | cut -d" " -f4
1234

ちなみに、cutのデフォルトの区切り文字は「タブ」です。

awkの場合

それに対して、awk(オーク)ではデフォルトで「1個以上の連続スペース」または「タブ」が区切り文字として扱われるため、以下の通り、きちんと取得できます。

$ ps -ef | head -n 3 | grep "ps -ef" | awk '{ print $2 }'
1234

(特殊変数の$1、$2・・・に、1番目のフィールド、2番目のフィールド・・・が入っている)





というわけで、スペース数が不定の場合はcutではなくawkを使うのが賢明だと思います。Mさん、ごめんなさい。今度ワイン一杯おごります。