我想找出(grep)我的哪些檔案中的模式沒有出現在日志檔案中。
我有一個檔案input.txt,其中包含:
00123
00124
00125
00126
和日志檔案20210716.log
00123
a
b
c
d
00125
00126
xy
z
...
(大量的文字)
...
00127
當使用grep -f input.txt 20210716.log在輸出中我得到:
00123
00125
00126
我怎樣才能從input.txt中輸出沒有出現在日志檔案中的模式呢,所以我想得到:
00124
uj5u.com熱心網友回復:
你可以試試這個grep:
grep -vFf file.log input.txt
00124
否則你可以像這樣使用awk:
awk 'NR == FNR {seen[1]; next} ! ($0 in seen)' file.log input.txt
00124
uj5u.com熱心網友回復:
這取決于你真正想要什么。你說的是模式,而匹配模式是很困難的。例如,如果你的輸入檔案包含應該被匹配的單詞,你可以使用以下方法:
$ grep -woFf input.txt file.log | grep -vwoFf - input.txt
這就把檔案input.txt讀成了一個要搜索的模式串列(-f),但這些模式被假定為固定的字串,而不是正則運算式(-F)。我們還假設我們只想匹配完整的單詞(-w),并且只輸出被匹配的內容(-o)。這個命令的輸出被反饋到grep的管道中,在那里我們將所有找到的詞作為固定的字串(-woFf -)進行反向(-v)的匹配。
這里的問題是,如果input.txt包含實際的正則運算式,反向的grep就不起作用(你不能搜索foo并試圖匹配可能出現在input.txt中的重碼fo*。
一個更可靠的匹配方法是使用awk:
awk '(NR==FNR){a[$1];next}.
{for(r in a) a[r] =(r~a)}。
END{for(r in a) if (a[r]==0) print r}。
' input.txt file.log
uj5u.com熱心網友回復:
你也可以使用join來實作。-v1抑制input.txt中的匹配輸出
join要求對資料進行排序
join -v1 <(sort input.txt) < (sort 20210716.log)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318339.html
標籤:
