如何使用其他文件中的搜索参数grep文件

时间:2010-09-02 00:27:42

标签: bash grep for-loop

我正在尝试使用包含IP地址的文件作为搜索思科防火墙配置文件的基础。通常,我会使用类似的东西:

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选项,但这也没有返回任何内容。我不是一个经验丰富的程序员,所以我可能会忽略一些显而易见的事情。

3 个答案:

答案 0 :(得分:22)

看起来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

答案 1 :(得分:5)

GNU grep,

grep -f ip.txt config

也建议不要使用for循环。 (如果这样做,您应该将IFS更改为$'\ n')。改为在读取循环时使用。

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

答案 2 :(得分:1)

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