我正在开发一个shell脚本,用于比较IPv4和IPv6的性能,我想以格式打印出值:
line_number, IPv4_average_speed IPv6_average_speed
这是我的脚本主要代码的一部分:
for i in $(head -100 "${1}" | cut -d ',' -f2)
do
#status="alive";
ping -c3 "${i}" > /dev/null
if [ $? -eq 0 ]
then
status_v4="alive";
else
status_v4="dead";
echo "Cannot ping the host "${i}"";
fi
ping6 -c3 "${i}" > /dev/null
if [ $? -eq 0 ]
then
status_v6="alive";
else
status_v6="dead";
fi
if [ "$status_v4" == "alive" ] && [ "$status_v6" == "alive" ]
then
((line_number++))
ping -c3 "${i}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | echo "$line_number,$(sed 's/$/ ms/')";
ping6 -c3 "${i}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | echo "$line_number,$(sed 's/$/ ms/')";
fi
done
我只能打印这样的输出,例如:
1, 6.542
1, 5.345
但我想要的是:
1, 6.542 5.345
我尝试将每个ping
的输出保存到变量中,然后使用awk
,但实际上我搞砸了代码。
我将最后一个if
语句中的部分代码更改为:
ipv4=$(ping -c3 "${i}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2)
ipv6=$(ping6 -c3 "${i}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2)
awk '{print "$line_number $ipv4 $ipv6" $1 $2 $3}'
它在屏幕上没有打印出来。有人可以帮我这个吗?
答案 0 :(得分:2)
尝试:
{
echo ${line_number},
ping -c3 "${i}" | awk -F/ '/^rtt/ {print $5}'
ping6 -c3 "${i}" | awk -F/ '/^rtt/ {print $5}'
} | paste -d " " - - -
失败的原因:
awk '{print "$line_number $ipv4 $ipv6" $1 $2 $3}'
是因为你试图在一个带引号的字符串中扩展shell变量。你可能想要像
这样的东西awk -v ln=$line_number -v ip4=$ipv4 -v ip6=$ipv6 'BEGIN {printf "%d, %s %s\n" ln, ip4, ip6}'
但是shell printf命令显然要简单得多
printf "%d, %s %s\n" $line_number $ipv4 $ipv6