如何将所有 std-output 从 bash 重定向到像‘grep’或‘sed’这样的命令来过滤输出然后将其写入文件?
原则上,这就是我想要的:exec > >(cat | cat >>/tmp/myoutput.txt)
。最后一个命令按预期工作。但如果我将第一个命令替换cat
为grep -v 'foo'
或 ,sed 's/foo/bar/g'
则不会将任何数据写入文件。
如何使上述示例与 grep 或 sed 一起工作?
背景:
我想过滤 .xsession-errors 中的错误消息。但
sed -i 's/foo/bar/g' .xsession-errors
无法正常工作,因为 sed 替换了文件 .xsession-errors,并且程序的未来输出不可见。因此,一个可行的方案是将 /etc/X11/Xsession 中的一行替换为过滤消息的代码。
更多信息请点击这里:
- 我使用了
cat
2 次来显示管道在子 shell 中按预期工作,并将所有内容路由到文件中。cat
当然,最终版本中不需要它。 - 我认为我有足够的输出来填充缓冲区,因为我确实多次
ls /usr/
填充了缓冲区。) exec | sed ...
不管用
答案1
例子:
- 打开一个 bash
- 调用命令
exec > >(cat | cat >>/tmp/myoutput.txt)
- 调用另一个命令,例如“ls -R /usr”
- 结束 bash
exit
- 查看文件 /tmp/myoutput.txt,您将看到
ls
命令的输出 - 如果你将步骤中的命令与此命令交换
exec > >(sed 's/usr/--HEREAMI--/g' >/tmp/myoutput2.txt)
这终于起作用了……
看来,确实是填充缓冲区的问题。几个ls /usr
是不够的,但ls -R /usr
会填满缓冲区。所以现在我需要弄清楚如何防止缓冲。
(感谢您的评论和请求示例,这带来了解决方案。)