Eu tentei fazer isso:
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
Quero pesquisar o nome de usuário FallenHope em 2 bancos de dados, mas eles não estão no mesmo formato e, para outros nomes de usuário, fornecerá apenas vários nomes de usuário derivados do nome de usuário original.
Os formatos de banco de dados são:
1 USERNAME [email protected] hashedpass
e
USERNAME:[email protected]:ip:ip:hashedpass
Eu também tentei fazer
grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
mas ainda não funciona
alguma maneira de fazer isso?
Responder1
Isto é o que man 1 grep
diz sobre grep -w
:
-w
,--word-regexp
Selecione apenas as linhas que contêm correspondências que formam palavras inteiras. O teste é que a substring correspondente deve estar no início da linha ou precedida por um caractere constituinte que não seja de palavra. Da mesma forma, deve estar no final da linha ou seguido por um caractere constituinte que não seja de palavra. Os caracteres constituintes da palavra são letras, dígitos e sublinhado. […]
Existem pelo menos dois problemas com sua abordagem baseada em grep FallenHope
ou grep -w FallenHope
:
- Não há garantia de que a correspondência seja contra o
USERNAME
campo. Por exemplo,FallenHope@…
o endereço de e-mail corresponde (e-w
não ajuda porque@
é um caractere que não constitui uma palavra). FallenHope-12345
corresponde (e-w
não ajuda porque-
é um caractere constituinte que não é de uma palavra).
Você precisaalfaiateo grep
padrão para caber em cada formatoseparadamente. Isso parece mais fácil para o segundo.
USERNAME:[email protected]:ip:ip:hashedpass
O seguinte grep
será pesquisado FallenHope
no início da linha. O rastro :
no padrão torna a correspondência FallenHope-1
ou FallenHopes
impossível.
grep '^FallenHope:' DATABASE2.sql
Adicione o redirecionamento ( >> breached.txt
) depois de garantir que meu código faça o que você deseja.
E para o primeiro formato
1 USERNAME [email protected] hashedpass
algo assim deve funcionar:
grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt
Ele procura zero ou mais dígitos no início da linha, seguido por zero ou mais espaços em branco, seguido por FallenHope
, seguido por um espaço em branco. Você pode preferir "um ou mais" a "zero ou mais", mas se o formato for estrito, "zero ou mais" deverá servir.
De qualquer forma você precisa ajustar o padrão ao formato. Se houver peculiaridades que eu não previ e você as conhece, ajuste o padrão de acordo.
Eu acho que awk
posso fazer isso também. A ferramenta foi projetada para funcionar comCampos, essa abordagem parece perfeita para o trabalho. Código de exemplo:
awk '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql