我尝试这样做:
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
我想在两个数据库中查找 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
或 的方法至少存在两个问题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