我有 2 个文件,我想找出差异并仅输出 ex2 中没有的内容
如果使用grep -Ff ex2.txt ex1.txt
,它会向我显示 a b c d
,如果我使用相同的命令,则-v
没有输出。为什么第一个命令也输出d
?
做到这一点最简单的方法是什么? grep 适合这个吗?也许 diff 可能是一个可以读取每一行并输出(如果存在或不存在)的脚本?
cat ex1.txt
a
b
c
d
cat ex2.txt
a
b
c
编辑——我的输出显示如下:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
grep -f ex2.txt ex1.txt
a
b
c
d
答案1
grep
并不是真正适合这里工作的工具,但快速浏览一下grep manpage
应该会有所帮助(请注意,不同grep
发行版之间的差异很大,因为有些发行版可能默认使用 GNU,而其他发行版可能会使用其他工具)。
- -F ...固定字符串(以换行符分隔)-(类别:匹配器选择)
- -f ... 文件名(类别:匹配控件)
- -v ...反转匹配(类别:匹配控制)
所以,你可能会想象类似的东西grep -Fvf ex2.txt ex1.txt
会起作用。然而,这不是一个好的解决方案,因为它要求您在开始之前已经了解有关文件的一些信息。有更好的工具(例如 的变体diff
)可以为您提供文件和/或目录之间更具体和更准确的差异。
编辑:固定字符串,而不是 Fire 字符串(该死的自动损坏)
答案2
尝试更改文件的顺序:
grep -v -f ex2.txt ex1.txt
> d
答案3
无法重现您的错误:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
d
grep -f ex2.txt ex1.txt
a
b
c
grep -Ff ex2.txt ex1.txt
a
b
c
grep -vFf ex2.txt ex1.txt
d
grep -V
grep (GNU grep) 2.20
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.5 (jessie)
Release: 8.5
Codename: jessie
编辑(在 OS X 上使用 BSD grep):
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -f ex2.txt ex1.txt
a
b
c
grep -vf ex2.txt ex1.txt
d
grep -Ff ex2.txt ex1.txt
a
b
c
grep -v -Ff ex2.txt ex1.txt
d
grep -V
grep (BSD grep) 2.5.1-FreeBSD