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

相關內容