2010-09-02 18 views
9

Ich versuche, eine Datei mit IP-Adressen als Grundlage für die Suche durch eine Cisco Firewall-Konfigurationsdatei verwenden. Normalerweise würde ich etwas wie verwenden:Wie grep eine Datei mit Suchparametern aus einer anderen Datei

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

Aber das kehrt absolut nichts zurück. Wenn ich das Skript in einer Datei speichern, und führen Sie es mit der Bash -xv Flags, gibt jede Zeile wie folgt aus:

+ 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 ist genau das, was ich passieren soll, aber ich bekomme nichts von diesem Befehl zurück.

Ich kenne die Option grep -f, aber das gibt auch nichts zurück. Ich bin kein erfahrener Programmierer, also übersehe ich vielleicht etwas Offensichtliches.

+0

wird nicht Ihr Problem beheben, aber Sie sollten immer Variablen zitieren, wenn sie Argumente auf einen Befehl sind. Es ist keine schlechte Idee, '' 'zu verwenden, um die Optionsverarbeitung zu stoppen, wenn eines der Argumente ebenfalls eine Variable ist. 'grep -" $ i "fw.config' –

Antwort

19

Es sieht aus wie ip.file ist im DOS-Format und hat \r\n Zeilenenden. Führen Sie dos2unix darauf aus, um in das UNIX-Format zu konvertieren. Dies wird die fehlerhaften \r Wagenrückläufe, die grep vermasseln, loswerden.

Übrigens können Sie grep -f FILE verwenden, um grep eine Liste der Muster zu übergeben, nach denen gesucht werden soll. Es wird dann einen einzigen Durchgang nach einem dieser Muster suchen.

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

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

der' -f'-Ansatz hat auch den Vorteil, dass er das Suchmuster als einfache Strings interpretiert - z. Die Punkte in "1.2.3.4" stimmen nur mit Punkten überein, nicht mit einem Zeichen. –

+0

Das war die Antwort. Die Liste der IP-Adressen wurde aus einer DNS-Zonendatei getippt, die ich von meinem DNS-Provider über einen Webbrowser heruntergeladen habe. Ich hatte keine Ahnung, dass es im DOS-Format war. Guter Fang. Nach dem Ausführen von dos2unix arbeitete grep -f wie erwartet. Vielen Dank. – Eric

5

GNU grep,

grep -f ip.txt config 

Seine ratsam, auch nicht für die Schleife mit Katze zu verwenden. (Wenn Sie dies tun, sollten Sie IFS zu $ ​​'\ n' ändern). Verwenden Sie stattdessen die Leseschleife. Diese

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

Die Verwendung der While-Schleife funktionierte auch nach dem Ausführen von dos2unix. – Eric

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