![将多个 unix 命令组合成一个输出](https://linux22.com/image/542094/%E5%B0%86%E5%A4%9A%E4%B8%AA%20unix%20%E5%91%BD%E4%BB%A4%E7%BB%84%E5%90%88%E6%88%90%E4%B8%80%E4%B8%AA%E8%BE%93%E5%87%BA.png)
我需要在我们的邮件日志中搜索特定的电子邮件地址。我们保存了一个名为邮件日志以及同一文件夹中一周的 .bz2 文件。目前,我正在运行以下命令来搜索该文件:
grep [email protected] maillog
bzgrep [email protected] *.bz2
有没有办法将grep
和bzgrep
命令合并为一个输出?这样,我就可以将合并的结果发送到单个电子邮件或单个文件中。
答案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,然后让输出到达文件,然后将该文件邮寄出去。