linux - bash 进程替换不能与 tee 一起正常工作

标签 linux bash tee

我真正想做的是 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

谁能帮帮我?

最佳答案

您可以在同一流上执行 headgrep

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/

相关文章:

linux - 即使是一个命令也能迅速使用 tee 命令

node.js - 'npm start' 错误

linux - PostgreSQL 非守护进程

linux - unix tty 在尾部用尖音符号 (`) 挂起

bash - Zsh 将所有输出通过管道传输到命令

linux - 将长标准输出管道传输到 tee 命令有时会导致截断

Linux - ffmpeg 3.4.6 与 4.2.1 - 带有 Tee(记录和流)的 bash 脚本在旧版本中运行得很好 - 新版本需要改变什么?

c++ - 导入 C++ 类的问题

linux - 无法将输出读取为输入(linux)

Linux:从 XML 文件中删除具有从第 2 次出现开始的匹配字符串的行的命令