Awk不能正确表示IP地址

时间:2013-12-31 10:17:51

标签: awk ip

我已经完成了用于排序极端交换机端口的bash脚本:

#!/bin/bash
file="/bin/visiextreme.txt" 

while read ip
do
    a=$(snmpwalk -v 2c -c test $ip ifDescr | column -t >> /bin/alias.txt )
    b=$(snmpwalk -v 2c -c test $ip ifAlias | awk '{print '$ip' " " $4 }' | column -t >> /bin/descr.txt ) 
done < "$file"

c=$( paste /bin/alias.txt /bin/descr.txt | awk ' /'tr_'/{print $7 " " $6 " " $8}' | column -t >> /bin/aliasdescr.txt )

visiextreme.txt填充了ip地址:

10.1.96.21
10.1.96.22
192.168.0.24
....

为什么在命令| awk '{print '$ip' " " $4 }' |之后我得到输出:

10.10.960.21
10.10.960.22
192.16800.24

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

将参数从bash传递到awk的首选方法是使用-v选项在命令行上提供它们。像:

awk -vip="$ip" '{print ip" "$4 }'

这可以解决您的问题。但是,你仍然可以使用你的方法,
但是我们必须在print的参数周围添加双引号。

请注意以下内容(摘自您的问题):

awk '{print '$ip' " " $4 }'

扩展为

awk '{print 10.1.96.21 " " $4}'

这显然不是我们想要的。因此,我们需要在10.1.96.21周围添加双引号,以使print了解我们要打印字符串10.1.96.21而不是数字10.1。所以这是一个解决方案:

awk '{print "'$ip' " $4 }'

如果10.1.96.21周围没有双引号,则点似乎在awk中扩展为零(!)。例如:

awk 'BEGIN {print 1.2.3.4}'

给出

1.20.30.4

(能解释这种行为的人吗?)