2010-09-02 11 views
9

Sto cercando di utilizzare un file contenente indirizzi IP come base per la ricerca attraverso un file di configurazione del firewall Cisco. Normalmente, vorrei usare qualcosa del tipo:Come grep un file utilizzando i parametri di ricerca da un altro file

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

Ma fare ciò non restituisce assolutamente nulla. Se metto lo script di cui sopra in un file ed eseguirlo con la bash -xv bandiere, ogni riga restituisce qualcosa di simile:

+ 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 è esattamente quello che voglio che accada, ma io non ottenere nulla indietro da questo comando.

Conosco l'opzione grep -f, ma non restituisce nulla. Non sono un programmatore esperto, quindi potrei trascurare qualcosa di ovvio.

+0

Questo non risolverà il problema, ma si dovrebbe sempre citare le variabili quando sono argomenti per un comando. Non è una cattiva idea usare '--' per interrompere l'elaborazione delle opzioni quando anche uno degli argomenti è una variabile. 'grep -" $ i "fw.config' –

risposta

19

Sembra che ip.file sia in formato DOS e abbia terminazioni di riga \r\n. Eseguire dos2unix su di esso per convertire in formato UNIX. Questo si sbarazzerà dei ritorni a capo errati \r che fanno casino grep.

A proposito, è possibile utilizzare grep -f FILE per passare a grep un elenco di modelli da cercare. Quindi eseguirà un singolo passaggio alla ricerca di uno di questi modelli.

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

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

l'approccio' -f' ha anche il vantaggio di interpretare il modello di ricerca come stringhe semplici - ad es. i punti in "1.2.3.4" corrisponderanno solo ai punti, non a qualsiasi carattere. –

+0

Questa era la risposta. L'elenco degli indirizzi IP è stato estratto da un file di zona DNS che ho scaricato dal mio provider DNS tramite un browser web. Non avevo idea che fosse nel formato dos. Buona pesca. Dopo aver eseguito dos2unix, grep -f ha funzionato come previsto. Grazie. – Eric

5

GNU grep,

grep -f ip.txt config 

E 'consigliabile anche non utilizzare per il ciclo con il gatto. (Se lo fai, dovresti cambiare IFS in $ '\ n'). Utilizzare invece il ciclo di lettura.

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

L'utilizzo del ciclo while ha funzionato anche dopo l'esecuzione di dos2unix. – Eric

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