在shell脚本中将输出打印到2个单独的列

问题描述 投票:0回答:1

我正在开发一个用于比较IPv4和IPv6性能的shell脚本,我想以格式打印出值:

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}'

它在屏幕上没有打印出来。有人可以帮我弄这个吗?

shell for-loop
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.