grep una palabra exacta en 2 archivos y luego escriba el resultado en un archivo

grep una palabra exacta en 2 archivos y luego escriba el resultado en un archivo

Intenté hacer eso:

grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt

Quiero buscar el nombre de usuario de FallenHope en 2 bases de datos, pero no están en el mismo formato y para otros nombres de usuario solo me dará un montón de nombres de usuario derivados del nombre de usuario original.

Los formatos de base de datos son:

1   USERNAME    [email protected]      hashedpass

y

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

También intenté hacer

grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt

Pero todavía no funciona

¿Alguna forma de hacerlo?

Respuesta1

Esto es lo que man 1 grepdice sobre grep -w:

-w, --word-regexp
Seleccione solo aquellas líneas que contengan coincidencias que formen palabras completas. La prueba es que la subcadena coincidente debe estar al principio de la línea o precedida por un carácter constituyente que no sea una palabra. De manera similar, debe estar al final de la línea o seguido de un carácter constituyente que no sea una palabra. Los caracteres que constituyen la palabra son letras, dígitos y guiones bajos. […]

Hay al menos dos problemas con su enfoque basado en grep FallenHopeo grep -w FallenHope:

  1. No hay garantía de que el partido sea contra el USERNAMEcampo. Por ejemplo, FallenHope@…la dirección de correo electrónico coincide (y -wno ayuda porque @no es un carácter constituyente de una palabra).
  2. FallenHope-12345coincide (y -wno ayuda porque -no es un carácter constituyente de una palabra).

NecesitasSastreEl greppatrón que se adapta a cada formato.por separado. Esto parece más fácil para el segundo.

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

Lo siguiente grepbuscará FallenHopeal principio de la línea. Seguir :el patrón hace que la coincidencia sea imposible FallenHope-1o FallenHopesimposible.

grep '^FallenHope:' DATABASE2.sql

Agregue redirección ( >> breached.txt) después de asegurarse de que mi código haga lo que desea.

Y para el primer formato

1   USERNAME    [email protected]      hashedpass

Algo como esto debería funcionar:

grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt

Busca cero o más dígitos al principio de la línea, seguidos de cero o más espacios en blanco, seguido de y FallenHopeseguido de un espacio en blanco. Es posible que prefiera "uno o más" mejor que "cero o más", pero si el formato es estricto, entonces "cero o más" debería estar bien.

De todos modos necesitas ajustar el patrón al formato. Si hay peculiaridades que no anticipé y las conoces, ajusta el patrón en consecuencia.


Creo que awktambién puedo hacer esto. La herramienta está diseñada para trabajar concampos, este enfoque parece perfecto para el trabajo. Código de ejemplo:

awk      '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql

información relacionada