使用模式文件的反向 grep 不显示不匹配

Tha*_*Guy 5 linux bash grep command-line

我有两个几乎相同的文件,"foo" 和 "bar"

每个文件有数千行,每行一个数字。

如果我sort然后diff两个文件,这是结果:

$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489
Run Code Online (Sandbox Code Playgroud)

但是,如果我有grep -Fvf两个文件,我在两个方向上都会得到零个“不匹配”:

$ grep -Fvf foo bar
$ grep -Fvf bar foo
$
Run Code Online (Sandbox Code Playgroud)

这是为什么?我不应该得到类似于 diff 的结果吗?我希望第一个命令返回 diff 值的“前半部分”,第二个 grep 命令返回其余部分。

为什么我没有得到预期的结果?

Joh*_*024 10

对于diff不同于grep -Fvf的顺序线出现问题。此外,由于该-x选项未包含在 grep 命令中,因此仅具有部分匹配的行将从输出中排除。

可重现的例子

考虑这两个文件:

$ cat foo
156
174
15676
17486
17487
$ cat bar
15677
15678
156
174
15676
Run Code Online (Sandbox Code Playgroud)

diff命令显示它们是不同的,而grep命令没有产生输出:

$ diff foo bar
0a1,2
> 15677
> 15678
4,5d5
< 17486
< 17487
$ grep -Fvf foo bar; grep -Fvf bar foo
Run Code Online (Sandbox Code Playgroud)

如果我们添加-x到 require 全行匹配,则 grep 产生:

$ grep -Fvxf foo bar
15677
15678
$ grep -Fvxf bar foo
17486
17487
Run Code Online (Sandbox Code Playgroud)

补充建议

正如abligh在评论中所建议的,diff -u产生更多的上下文,这可以使输出更容易理解。

  • 我会添加 `diff -u` 而不是 `diff` 通常可以更容易地看到发生了什么。 (2认同)