2010-09-02 11 views
9

Estoy tratando de usar un archivo que contenga direcciones IP como base para buscar a través de un archivo de configuración de firewall de Cisco. Normalmente, usaría algo como:Cómo grep un archivo usando los parámetros de búsqueda de otro archivo

for i in $(cat ip.file); do grep $i fw.config; done 

Pero al hacerlo no devuelve absolutamente nada. Si pongo la secuencia de comandos anterior en un archivo y ejecutarlo con la fiesta -xv banderas, cada línea vuelve algo como esto:

+ for i in '`cat ip.file`' 
+ grep $'1.2.3.4\r' fw.config (each IP address is different) 

grep 1.2.3.4 fw.config es exactamente lo que quiero que suceda, pero no recibir nada de este comando.

Conozco la opción grep -f, pero eso tampoco devuelve nada. No soy un codificador experimentado, por lo que podría pasar por alto algo obvio.

+0

esto no va a arreglar el problema, pero siempre hay que citar las variables cuando son argumentos a un comando. No es una mala idea usar '--' para detener el procesamiento de opciones cuando uno de los argumentos es también una variable. 'grep -" $ i "fw.config' –

Respuesta

19

Parece que ip.file está en formato DOS y tiene \r\n terminaciones de línea. Ejecute dos2unix en él para convertirlo a formato UNIX. Esto eliminará los retornos de carro erróneos \r que están estropeando grep.

Por cierto, puede usar grep -f FILE para pasar grep una lista de patrones para buscar. Luego hará un pase único buscando cualquiera de esos patrones.

# After doing `dos2unix ip.file'... 
grep -f ip.file fw.config 

# Or... 
grep -f <(dos2unix < ip.file) fw.config 
+0

el enfoque' -f' también tiene la ventaja de que interpreta el patrón de búsqueda como cadenas simples, p. ej. los puntos en "1.2.3.4" solo coincidirán con puntos, no con ningún carácter. –

+0

Esta fue la respuesta. La lista de direcciones IP se extrajo de un archivo de zona dns que descargué de mi proveedor de DNS a través de un navegador web. No tenía idea de que estaba en formato dos. Buena atrapada. Después de ejecutar dos2unix, grep -f funcionó como se esperaba. Gracias. – Eric

5

grep de GNU,

grep -f ip.txt config 

sus aconsejable no usar también para el lazo con el gato. (Si lo hace, debe cambiar IFS a $ '\ n'). Use while read loop en su lugar.

while read -r line 
do 
    .... 
done <"ip.txt" 
+0

El uso del bucle while funcionó tan bien después de ejecutar dos2unix. – Eric

1
for i in $(tr '\r' '\n' < ip.file); do grep $i fw.config; done 
Cuestiones relacionadas