为什么我的 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
过程。)