运行一次命令并过滤多个文件中的输出

运行一次命令并过滤多个文件中的输出

无论如何,是否可以通过仅运行一次 mycommand.sh 将过滤后的输出重定向到多个文件?

示例输出应与此类似:

mycommand.sh | grep --line-buffered -B 1 A >> file1 ; my command.sh | grep --line-buffered -A 1 B >> file2

或者也许用egrep以某种方式......

答案1

awk命令:

mycommand.sh | awk '/A/{ print > "file1" }/B/{ print > "file2" }'
  • /A/{ print > "file1" }- 如果记录与模式匹配,则A打印/重定向整个记录到file1

答案2

awk是一个更好的工具,因为它速度更快,不需要分叉grep或多次,并且可以轻松扩展到写入任意数量的文件。对于大多数其他脚本语言来说也是如此,例如perlpython

在 shell 中,您可以使用tee流程替代。例如

mycommand.sh |
  tee >(grep --line-buffered -A 1 B >> file2) |
  grep --line-buffered -B 1 A >> file1

(添加额外的换行和缩进以提高可读性。如果您喜欢难看且难以阅读的内容,则所有内容都可以在一行上使用)

tee将其输入写入两个都stdout(例如到终端、重定向到文件或通过管道传送到管道中的下一个命令)到命令行上指定的文件。

在这种情况下,该“文件”是由进程替换提供的文件描述符(例如grep具有重定向输出的另一个命令,如上例所示)。

tee可以同时写入多个输出文件(或进程替换文件描述符)。例如:

mycommand.sh |
  tee >(grep --line-buffered -A 1 B >> file2) \
    >(grep --line-buffered -A 1 C >> file3) \
    >(grep --line-buffered -A 1 D >> file4) |
  grep --line-buffered -B 1 A >> file1

这可行,但我个人会使用@RomanPerekhrest 的awk答案。

相关内容