为什么我的 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不包括该sed过程。)

相关内容