如何过滤和重定向输出

如何过滤和重定向输出

我有一个命令会向 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;}':)

请注意,对于sedpattern是一个基本的正则表达式,而 for awk,它是一个扩展正则表达式。

答案2

您可以使用管道来做到这一点:

./myCMD | grep keyword > tmp

这只会将包含“关键字”的行写入文件tmp

如果您想查看完整的输出,但仅将一部分记录到文件中,请添加tee(假设您的 shell 支持进程替换):

./myCMD | tee >(grep keyword > tmp)

相关内容