grep 使用文件

grep 使用文件

我有 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

相关内容