在shell脚本中将输出打印到2个单独的列
我正在开发一个shell脚本,用于比较IPv4和IPv6的性能,我想以以下格式打印值:在shell脚本中将输出打印到2个单独的列,shell,for-loop,Shell,For Loop,我正在开发一个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
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}'
它在屏幕上什么也不打印。有人能帮我吗?试试:
{
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
你能分享错误吗?这可能有助于解决问题。另外:管道ping到tail到awk到cut到echo(?)不能是一个整洁的解决方案。是的,您可以只使用ping进行尝试,它可以很好地打印出来:)