2010-09-02 90 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 
相关问题