将多个 unix 命令合并为一个输出

Ben*_*ack 9 linux unix bash grep

我需要在我们的邮件日志中搜索特定的电子邮件地址。我们将一个名为maillog的当前文件以及一周的 .bz2 文件保存在同一文件夹中。目前,我正在运行以下命令来搜索文件:

grep person@domain.com maillog
bzgrep person@domain.com *.bz2
Run Code Online (Sandbox Code Playgroud)

有没有办法将grepbzgrep命令组合成一个输出?这样,我可以将合并的结果通过管道传输到单个电子邮件或单个文件。

gee*_*aur 24

另一种方式是

{ grep ...; bzgrep ...;} >file
Run Code Online (Sandbox Code Playgroud)

&&有一个困难,bzgrep如果grep失败就不会运行。

请注意最后一个命令后的左花括号和分号后的强制性空格。或者,您可以使用 subshel​​l 语法(括号而不是花括号),它不是那么挑剔:

(grep ...; bzgrep ...) >file
Run Code Online (Sandbox Code Playgroud)

  • 你不是说`()`而不是`{}`吗? (2认同)

Phi*_*ack 11

如果文件不是 bzip 压缩的,bzgrep 会自动默认为常规 grep。因此,以下内容就足够了:

bzgrep person@domain.com maillog *bz2 | mail -s "logs yay" someuser@blah
Run Code Online (Sandbox Code Playgroud)

哦,当然这也是我的强制性GNU Parallel解决方案:

parallel -m bzgrep person@domain.com ::: maillog* *bz2 | mail -s "logs yay" someuser@blah
Run Code Online (Sandbox Code Playgroud)

如果您正在检查大量文件,这可能会快很多。