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 grep
dice 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 FallenHope
o grep -w FallenHope
:
- No hay garantía de que el partido sea contra el
USERNAME
campo. Por ejemplo,FallenHope@…
la dirección de correo electrónico coincide (y-w
no ayuda porque@
no es un carácter constituyente de una palabra). FallenHope-12345
coincide (y-w
no ayuda porque-
no es un carácter constituyente de una palabra).
NecesitasSastreEl grep
patró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 grep
buscará FallenHope
al principio de la línea. Seguir :
el patrón hace que la coincidencia sea imposible FallenHope-1
o FallenHopes
imposible.
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 FallenHope
seguido 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 awk
tambié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