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

在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

我正在开发一个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}'
它在屏幕上什么也不打印。有人能帮我吗?

试试:

{
  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进行尝试,它可以很好地打印出来:)