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