我正在尝试构建一个必须包含该术语并排除另一个术语的 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"
后一种语法至少有一个优点,在这是我的另一个答案。