“Ungrep” - 哪些模式不匹配

Edw*_*ern 13 grep

我正在寻找一个命令或脚本来执行以下操作 - 给定:

文件1.txt:

abcd
efgh 
ijkl
mnop
Run Code Online (Sandbox Code Playgroud)

文件2.txt:

123abcd123
123efgh123
123mnop123
Run Code Online (Sandbox Code Playgroud)

我想要一个执行以下操作的命令:

ungrep file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

并返回以下内容:

ijkl
Run Code Online (Sandbox Code Playgroud)

换句话说,它给了我 file1.txt 中的行,这些行不会在 file2.txt 的 grep 上返回任何结果。我知道我可以通过遍历 file1.txt,为每一行 grepping file2.txt 并存储结果,并输出结果为空的任何行来做到这一点,但我希望有一种更有效的方法来做到这一点。

iru*_*var 18

使用 GNUgrep以下应该可以工作。使用该-f选项,file1.txt作为“模式文件”传递 - 但也作为数据文件再次传递。用于-o仅报告匹配的部分。最后提取那些只匹配一次的单词 - 这些对应于file1.txtfile2.txt.

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl
Run Code Online (Sandbox Code Playgroud)

  • 您可以在没有 grep 技巧的情况下实现相同的效果:`sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u`,但是,就像您的解决方案一样,这仅在模式文件实际上不包含任何正则表达式元字符时才有效。 (4认同)
  • 改进:`grep -oFf file1.txt file2.txt | 排序file1.txt - | uniq -u` (2认同)

Sté*_*las 10

你可以这样做awk

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

通过使用index,我们正在寻找子字符串而不是匹配正则表达式。

因为我们一找到匹配就从数组中删除这个词,所以我们避免了不必要的搜索。