grep uma palavra exata em 2 arquivos e depois escreva o resultado em um arquivo

grep uma palavra exata em 2 arquivos e depois escreva o resultado em um arquivo

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 grepdiz 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 FallenHopeou grep -w FallenHope:

  1. Não há garantia de que a correspondência seja contra o USERNAMEcampo. Por exemplo, FallenHope@…o endereço de e-mail corresponde (e -wnão ajuda porque @é um caractere que não constitui uma palavra).
  2. FallenHope-12345corresponde (e -wnão ajuda porque -é um caractere constituinte que não é de uma palavra).

Você precisaalfaiateo greppadrão para caber em cada formatoseparadamente. Isso parece mais fácil para o segundo.

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

O seguinte grepserá pesquisado FallenHopeno início da linha. O rastro :no padrão torna a correspondência FallenHope-1ou FallenHopesimpossí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 awkposso 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

informação relacionada