grep 2 個檔案中的確切單字,然後將結果寫入檔案中

grep 2 個檔案中的確切單字,然後將結果寫入檔案中

我嘗試這樣做:

grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt

我想在 2 個資料庫中尋找 FallenHope 用戶名,但它們的格式不同,對於其他用戶名,它只會給出一堆從原始用戶名派生的用戶名。

資料庫格式為:

1   USERNAME    [email protected]      hashedpass

USERNAME:[email protected]:ip:ip:hashedpass

我也嘗試過做

grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt

但它仍然不起作用

有什麼方法可以做到嗎?

答案1

這是man 1 grep關於grep -w

-w,--word-regexp
僅選擇包含構成整個單字的符合項目的行。測試是匹配的子字串必須位於行的開頭,或者前面有一個非單字組成字元。同樣,它必須位於行尾或後跟非單字組成字元。單字組成字元是字母、數字和底線。 […]

基於grep FallenHopeor的方法至少有兩個問題grep -w FallenHope

  1. 無法保證匹配是針對現場USERNAME的。例如,FallenHope@…電子郵件地址確實匹配(並且-w沒有幫助,因為@它是非單字組成字元)。
  2. FallenHope-12345確實匹配(並且-w沒有幫助,因為-是非單字組成字元)。

你需要裁縫grep適合每種格式的模式分別地。這對於第二個來說似乎更容易。

USERNAME:[email protected]:ip:ip:hashedpass

以下將在行的最開頭grep進行搜尋。模式中的FallenHope尾隨會導致匹配或不可能。:FallenHope-1FallenHopes

grep '^FallenHope:' DATABASE2.sql

>> breached.txt在確保我的程式碼執行您想要的操作後新增重定向 ( )。

對於第一種格式

1   USERNAME    [email protected]      hashedpass

像這樣的東西應該​​有效:

grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt

它在行首搜尋零個或多個數字,後面跟著零個或多個空格,然後是FallenHope,然後是空格。您可能更喜歡“一個或多個”而不是“零個或多個”,但如果格式嚴格,那麼“零個或多個”應該沒問題。

無論如何,您需要將模式調整為格式。如果存在我沒有預料到的怪癖並且您知道它們,請相應地調整模式。


我認為awk也可以做到這一點。該工具旨在與領域,這種方法似乎非常適合這項工作。範例程式碼:

awk      '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql

相關內容