![如何过滤和重定向输出](https://linux22.com/image/129124/%E5%A6%82%E4%BD%95%E8%BF%87%E6%BB%A4%E5%92%8C%E9%87%8D%E5%AE%9A%E5%90%91%E8%BE%93%E5%87%BA.png)
我有一个命令会向 STDOUT 生成大量输出,我知道可以通过这种方式将其重定向到文件中:
./myCMD 1>tmp
在将输出重定向到文件之前如何对其进行过滤。例如,我只想重定向那些包含某些关键字的输出行。
答案1
如果您的意思是只希望某些行进入文件tmp
,而其余行保持不变:
cmd | awk '/pattern/ {print > "tmp"; next}
{print}'
或者:
cmd | sed '/pattern/!b
w tmp
d'
(一行cmd | sed -e '/pattern/!b' -e 'w tmp' -e d
:)
或者:
cmd | sed '/pattern/ {
w tmp
d
}'
(一行cmd | sed -e '/pattern/{w tmp' -e 'd;}'
:)
请注意,对于sed
,pattern
是一个基本的正则表达式,而 for awk
,它是一个扩展正则表达式。
答案2
您可以使用管道来做到这一点:
./myCMD | grep keyword > tmp
这只会将包含“关键字”的行写入文件tmp
。
如果您想查看完整的输出,但仅将一部分记录到文件中,请添加tee
(假设您的 shell 支持进程替换):
./myCMD | tee >(grep keyword > tmp)