在两个文件中 grep 一个精确的单词,然后将结果写入文件

在两个文件中 grep 一个精确的单词,然后将结果写入文件

我尝试这样做:

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

  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

相关内容