2010-09-02 80 views
9

我試圖使用包含IP地址的文件作爲搜索思科防火牆配置文件的基礎。通常情況下,我會使用類似的東西:如何使用來自其他文件的搜索參數來grep文件

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

但是,這樣做絕對不會返回任何結果。如果我把上面的腳本到一個文件中,並在bash執行它-xv標誌,每行返回是這樣的:

+ 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正是我希望發生的事情,但我從這個命令中得不到任何回報。

我知道grep -f選項,但那也不會返回任何結果。我不是一個有經驗的編碼員,所以我可能會忽略一些明顯的東西。

+0

這不會解決你的問題,但你應該總是給變量時,他們參數的命令。當一個參數也是一個變量時,使用'--'來停止選項處理並不是一個壞主意。 ''grep - 「$ i」fw.config' – 2010-09-02 02:44:33

回答

19

它看起來像ip.file是DOS格式,並有\r\n行結束。運行dos2unix就可以轉換成UNIX格式。這將擺脫錯誤\r回車正在搞亂grep

順便說一下,您可以使用grep -f FILE傳遞grep要搜索的模式列表。然後,它會對這些模式進行一次搜索。

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

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

'-f'方法還具有將搜索模式解釋爲簡單字符串的優點 - 例如, 「1.2.3.4」中的點只會匹配點,而不是任何字符。 – 2010-09-02 06:21:33

+0

這就是答案。 IP地址列表是從我通過網絡瀏覽器從我的dns提供商下載的dns區域文件中grepped的。我不知道它是DOS格式。接得好。運行dos2unix後,grep -f按預期工作。謝謝。 – Eric 2010-09-02 16:35:09

5

的GNU grep

grep -f ip.txt config 

它最好也不要使用與貓循環。 (如果你這樣做,你應該將IFS更改爲$'\ n')。相反,使用while循環。

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

運行dos2unix後,使用while循環也很有效。 – Eric 2010-09-02 16:36:01

1
for i in $(tr '\r' '\n' < ip.file); do grep $i fw.config; done 
相關問題