2013-11-20 69 views
0

我正在開發一個用於比較IPv4和IPv6的性能shell腳本,我想在格式上打印出值:打印輸出到shell腳本2個獨立的列

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

?它可能有助於解決問題。另外:管道ping到尾巴awk切割回聲(?)不能是一個整潔的解決方案。 – pfnuesel

+0

它是,你可以嘗試只用ping,它打印出很好:) –

回答

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