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

时间:2013-11-20 22:30:57

标签: 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
            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}'

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

1 个答案:

答案 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