我有一个文本文件,我想搜索具有 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 信号,最终终止管道。