我已经完成了用于排序极端交换机端口的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
有什么建议吗?
答案 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
(能解释这种行为的人吗?)