我嘗試這樣做:
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 FallenHope
or的方法至少有兩個問題grep -w FallenHope
:
- 無法保證匹配是針對現場
USERNAME
的。例如,FallenHope@…
電子郵件地址確實匹配(並且-w
沒有幫助,因為@
它是非單字組成字元)。 FallenHope-12345
確實匹配(並且-w
沒有幫助,因為-
是非單字組成字元)。
你需要裁縫grep
適合每種格式的模式分別地。這對於第二個來說似乎更容易。
USERNAME:[email protected]:ip:ip:hashedpass
以下將在行的最開頭grep
進行搜尋。模式中的FallenHope
尾隨會導致匹配或不可能。:
FallenHope-1
FallenHopes
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