将 grep 输出通过管道传输到 bash 中的 grep

将 grep 输出通过管道传输到 bash 中的 grep

我有一个文本文件,我想搜索具有 search_string 但不具有 except_string 的行。

在终端中,以下给出了我想要的输出:

grep "search_string" | grep -v "\(exclude_string_A\|exclude_string_B\)"

我有一个 bash 脚本,它扫描文本文件中的特定问题(主要使用 grep 和 sed),我想向其中添加此搜索,但我似乎无法使其工作。第一个 grep 命令的输出似乎没有被用作第二个命令的输入。

例如,对于包含以下内容的文件:

Gary: yes, that's what I said.  
Paul: well, I didn't hear you.  
Gary: okay, let's go.  

在 bash 脚本中,相关行是:

grep "Gary:" | grep -v "\(said\|told\)" $1

但输出文件包含该部分:

Paul: well, I didn't hear you.  
Gary: okay, let's go.

我希望这里缺少一些简单的东西!

答案1

您的想法是正确的,但您的输入文件/字符串参数位于错误的位置。它应该写成

grep "Gary:" "$1" | grep -v "\(said\|told\)"

这意味着应用第一个grep表达式来匹配全部包含单词 或 的行Gary并过滤包含单词said或 的行told

通过您的尝试,由于使用管道运行,两个进程都会启动,但处理输入grep后的部分就好像它是一个文件一样,而不是从管道中从标准输入获取输入并打印您所看到的几行。|$1

但此时,您会看到终端挂起,因为第一个终端grep仍在等待其标准输入流上的输入,但它没有看到任何输入。按Ctrl-C发送 SIGINT 信号,最终终止管道。

相关内容