我需要在我们的邮件日志中search特定的电子邮件地址。 我们保存一个名为maillog的当前文件以及一个星期的.bz2文件在同一个文件夹中。 目前,我运行以下命令来search文件:
grep [email protected] maillog bzgrep [email protected] *.bz2
有没有办法将grep和bzgrep命令组合成一个输出? 这样,我可以将组合的结果输送到单个电子邮件或单个文件。
另一种方法是
{ grep ...; bzgrep ...;} >file
&&有困难,如果grep失败, bzgrep将不会运行。
请注意在最后一个命令之后打开大括号和分号后的必需空格。 或者,您可以使用subshell语法(括号而不是大括号),这不是很挑剔:
(grep ...; bzgrep ...) >file
如果文件不是bzip压缩的,bzgrep将自动默认为常规grep。 因此以下就足够了:
bzgrep [email protected] maillog *bz2 | mail -s "logs yay" someuser@blah
哦,当然这也是我的强制性GNU并行解决scheme:
parallel -m bzgrep [email protected] ::: maillog* *bz2 | mail -s "logs yay" someuser@blah
如果您正在检查大量文件,这可能会快很多。
这是另一种方法(假设你正在运行bash,你可能是这样):
cat <(bzgrep ...) <(grep ...)
这里bash透明地将bzgrep和grep命令的输出提供给cat,就好像它们是文件一样(它们是在底层,底层是url)。
在你的具体情况下,我build议菲尔的解决scheme,但以上是一个很好的把戏,保持在你的包里。
如果你有兴趣,你可以在这里阅读更多: http : //www.tldp.org/LDP/abs/html/process-sub.html
在我写这篇文章的时候,大部分(如果不是全部的话)Bourne派生的shell,包括bash ,所接受的答案的语法是错误的。 我build议编辑顶部和接受的答案来解决这个问题,但我也倾向于添加所有这些其他信息,这将更多的是重写而不是编辑。
你可以使用复合命令:
{ grep ...; bzgrep ...; } >file
..或子壳(注意括号而不是大括号):
(grep ...; bzgrep ...) >file
..将这些命令分组。 子shell方法有更好的语法(更多的宽容缺乏空白,并允许您省略最后一个分号),但它要么分叉一个新的进程,要么“假装”通过让命令运行在一个清理环境。 两者都有优势,取决于你想做什么,这里不重要,但是如果你想要更熟练的贝壳,就值得仰视。
注意:你也可以用这些技巧来使用stream水线,所以你可以这样做:
{ grep ...; bzgrep ...; } | less
如果你不关心组合输出中匹配的顺序,那么你可以在两个命令之间使用一个& ,例如: { grep ... & bzgrep ...; } { grep ... & bzgrep ...; } 。 然后这两个命令同时运行: grep被启动,shell将其放在后台,然后shell会运行bzgrep 。 (但有一个小警告,与解释涉及文件redirect和文件stream缓冲可能会导致输出文件中的行很小的一部分被拆分/ mangled:是否你会看到这将取决于你的grep , bzgrep和libc stdio.h函数被实现了,在大多数的实现中,我相信在redirect到一个文件之前pipe道化命令可以避免这个问题,所以你可以把{ foo & bar; } | cat - >file作为一个解决方法。 )
您可以将命令与&&结合在一起,这样您可以运行每个命令。
你也可以添加>> textfile.txt到每个命令的末尾,并输出命中一个文件,然后将该文件邮寄出去。