![运行一次命令并过滤多个文件中的输出](https://linux22.com/image/126305/%E8%BF%90%E8%A1%8C%E4%B8%80%E6%AC%A1%E5%91%BD%E4%BB%A4%E5%B9%B6%E8%BF%87%E6%BB%A4%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%BE%93%E5%87%BA.png)
无论如何,是否可以通过仅运行一次 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
或多次,并且可以轻松扩展到写入任意数量的文件。对于大多数其他脚本语言来说也是如此,例如perl
或python
。
在 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
答案。