sedコマンドがpsヘッダーを印刷するのはなぜですか?

sedコマンドがpsヘッダーを印刷するのはなぜですか?

私のsedコマンドがここにpsヘッダーを印刷するのはなぜですか?

$ ps | sed -E "s/\s*([[:digit:]]+)\s+.*/\1/"
  PID TTY          TIME CMD
26636
26637
54326

PID TTY TIME CMDラインがフィルタを通過するのはなぜですか? 、、でg正規表現を終了すると役に立ちpません。


$ ps | sed -n -E "s/\s*([[:digit:]]+)\s+.*/\1/"
$ ps | sed -E "s/\s*([[:digit:]]+)\s+.*/\1/"
  PID TTY          TIME CMD
17966
17967
54326
$ ps | sed -E "s/\s*([[:digit:]]+)\s+.*/\1/p"
  PID TTY          TIME CMD
18429
18429
18430
18430
54326
54326
$ ps | sed -n -E "s/\s*([[:digit:]]+)\s+.*/\1/p"
18734
18735
54326
$ ps | sed -n -E "s/\s*([[:digit:]]+)\s+.*/\1/g"
$ 

とてもカジュアルに見えます:)


タイトルを印刷する理由:

$ ps | sed -n -E "s/^\s*([^\s]+)\s*([^\s]+)\s*([^\s]+)\s*([^\s]+).*$/\1/p"
PID TTY          TIME 
34666
34667
54326

答え1

一致するものがs/pattern/replacementない場合は、pattern何もせずにsedデフォルトでパターンスペースを印刷します。印刷したい場合ただ結果を置き換えるには、-n(デフォルトの印刷を抑制するために)およびp(成功した交換後にパターンスペースを印刷するために)、以下を追加します。

ps | sed -n -E "s/\s*([[:digit:]]+)\s+.*/\1/p"

ps後処理が必要ないようにPIDのみを出力したい場合があります。

ps -opid=

ps(プロセスが含まれていないため、出力が1つ減少する可能性がありますsed。)

関連情報