我真正想做的是 ps -ef|head -n1 && ps -ef|grep httpd
。输出应该是这样的。
UID PID PPID C STIME TTY TIME CMD
xxxxx 6888 6886 0 16:49 pts/1 00:00:00 grep --color=auto httpd
root 10992 1 0 13:56 ? 00:00:00 sudo ./myhttpd
root 10993 10992 0 13:56 ? 00:00:00 ./myhttpd
root 11107 10993 0 13:56 ? 00:00:00 ./myhttpd
root 12142 10993 0 14:00 ? 00:00:00 ./myhttpd
root 31871 10993 0 15:03 ? 00:00:00 ./myhttpd
但我讨厌重复。所以,我希望 ps -ef
只出现一次。
考虑到 bash 进程替换,我尝试了 ps -ef | tee >>(head -n1) >(grep httpd)
,但唯一的输出是
UID PID PPID C STIME TTY TIME CMD
但是,ps -ef | tee >>(head -n1) >(head -n2)
可以通过以下方式正常工作
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:36 ? 00:00:00 /sbin/init
UID PID PPID C STIME TTY TIME CMD
谁能帮帮我?
最佳答案
您可以在同一流上执行 head
和 grep
。
ps -ef | (head -n 1; grep '[h]ttpd')
重构为使用 sed
可能稍微更有效:
ps -ef | sed -n -e '1p' -e '/[h]ttpd/p'
...但并非所有 sed
方言都能友好地处理多个 -e
选项。也许这更便携:
ps -ef | sed '1b;/[h]ttpd/b;d'
另请注意重构正则表达式的老技巧,以免使用字符类匹配自身。
关于linux - bash 进程替换不能与 tee 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20581361/