将多个 unix 命令组合成一个输出

将多个 unix 命令组合成一个输出

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

grep [email protected] maillog
bzgrep [email protected] *.bz2

有没有办法将grepbzgrep命令合并为一个输出?这样,我就可以将合并的结果发送到单个电子邮件或单个文件中。

答案1

另一种方法是

{ grep ...; bzgrep ...;} >file

&&存在的困难是,bzgrep如果失败了,就不会运行grep

请注意,左花括号后必须有空格,最后一个命令后必须有分号。或者,您可以使用子 shell 语法(用圆括号代替花括号),这样就不那么挑剔了:

(grep ...; bzgrep ...) >file

答案2

如果文件未经过 bzip 压缩,则 bzgrep 自动默认为常规 grep。因此以下内容应该足够了:

bzgrep [email protected] maillog *bz2 | mail -s "logs yay" someuser@blah

哦,当然,这是我的义务GNU 并行解决方案:

parallel -m bzgrep [email protected] ::: maillog* *bz2 | mail -s "logs yay" someuser@blah

如果您要检查大量文件,这可能会快得多。

答案3

这是另一种方法(假设您正在运行 bash,您可能正在运行):

cat <(bzgrep ...) <(grep ...)

这里 bash 透明地将 bzgrep 和 grep 命令的输出提供给 cat,就好像它们是文件一样(它们在引擎盖下,详细信息请参见底部的 url)。

针对您的具体情况,我推荐 Phil 的解决方案,但上述技巧也值得您借鉴。

如果你有兴趣,可以在这里阅读更多内容:http://www.tldp.org/LDP/abs/html/process-sub.html

答案4

您可以使用 && 将命令绑定在一起,这样您就可以运行每个命令。

您还可以在每个命令末尾添加 >> textfile.txt,然后让输出到达文件,然后将该文件邮寄出去。

相关内容