如何从文件中查找“包括”和“排除另一个术语”?

如何从文件中查找“包括”和“排除另一个术语”?

我正在尝试构建一个必须包含该术语并排除另一个术语的 grep 搜索。我尝试使用多个 -E“模式”选项,但没有奏效。

这是我尝试过的命令的示例。

grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv

但输出结果只匹配第二个约束 grep -Eiv "10.10.210.154"

答案1

假设你想查找\,17\:31但不是从 IP10\.10\.210\.154

你可以用这个。

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154" 

答案2

笔记:另一个答案应该可以工作,但是它什么都没解释;因此我给出解释性的答案。

您告诉第二个grep读取file.csv,它就会读取。它会忽略其标准输入,因为这是grep它在操作文件时所做的。

实际上,第二个函数的grep作用就如同第一个函数不存在一样。它在处理完文件并打印其输出(如果有)后退出。

第一个grep等待输入(如果在交互式 shell 中运行,通常来自键盘)。它可以接收多行,甚至将多行(匹配)打印到其标准输出,直到管道缓冲区决定将输出传递给第二个grep。然后,如果第二个grep不再存在,grep则通知第一个管道已断开;它退出。

或者您可以按Ctrl+D来表示输入结束;或者您可以按Ctrl+C来终止第一个grep(以及第二个,如果它还活着的话)。但这不会修复您的数据流。

正确的数据流是这样的:您需要第一个grep读取文件,然后将结果传送到第二个:

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"

后一种语法至少有一个优点,在这是我的另一个答案

相关内容