2014-03-02 62 views
2

我試圖創建一個腳本來處理來自ping的數據。因此,將與時間戳的標準格式來自文件:處理Ping數據(正則表達式)

PING google.com (4.34.16.45) 56(84) bytes of data. 
[1393790120.617504] 64 bytes from 4.34.16.45: icmp_req=1 ttl=63 time=25.7 ms 
[1393790135.669873] 64 bytes from 4.34.16.45: icmp_req=2 ttl=63 time=30.2 ms 
[1393790150.707266] 64 bytes from 4.34.16.45: icmp_req=3 ttl=63 time=20.6 ms 
[1393790161.195257] 64 bytes from 4.34.16.45: icmp_req=4 ttl=63 time=35.2 ms 

--- google.com ping statistics --- 
4 packets transmitted, 4 received, 0% packet loss, time 45145ms 
rtt min/avg/max/mdev = 20.665/27.970/35.246/5.390 ms 

我希望削減它只是時間戳,時間和請求數,像這樣(注意,這是從不同的數據集,給出一個例如):

0.026202538597014928 26.2 1 
0.253859701473 24.5 2 
1.0482067203067074 32.0 3 
1.6627447926949444 139.6 4 
2.2686229201578056 237.1 5 

我意識到我需要使用sed來完成此操作。但是,我仍然很困惑,因爲表達式會切入正確的數據。我想我會沿着這些線:

cat $inFile | grep -o "$begin$regex$end" | sed "s/$end//g" | sed "s/$begin//g" > $outFile 

我只是不知道$開始和$結束會是什麼。

TL; DR幫我理解正則表達式?

回答

2

你可以嘗試以下命令:

sed -ne ' 
    2,/^$/ { 
     /^$/! { 
      s/^\[\([^]]*\).*icmp_req=\([0-9]*\).*time=\([0-9.]*\).*$/\1 \3 \2/ 
      p 
     } 
    } 
' infile 

它使用-n開關,以避免輸入線自動打印。它在第二個和第一個之間選擇一段空白的行,並對每一行我要提取的文本進行分組。

假設infile與問題的內容,它產生:

1393790120.617504 25.7 1 
1393790135.669873 30.2 2 
1393790150.707266 20.6 3 
1393790161.195257 35.2 4 

UPDATE用更簡單的Scrutinizer's溶液(見註釋):

sed -n 's/^\[\([^]]*\).*icmp_req=\([0-9]*\).*time=\([0-9.]*\).*$/\1 \3 \2/p' infile 
+2

嗨比瑞,模式是這樣的,範圍是不必要的:'sed -n's /^\[\([^]]*\).* icmp_req = \([0-9] * \)。* time = \([0-9。] * \)。* $/\ 1 \ 3 \ 2/p''應該就夠了,不是嗎? – Scrutinizer

+0

@Scrutinizer:你說得對。我用這個更簡單的答案更新了答案。 – Birei

0

對於純的正則表達式溶液,看到這個表達式:

\[([\d\.]*)].*?=(\d+).*?=([\d\.]*) ms 

您可以查看在線演示在這裏:

Regex101.com

2

良好的措施,這裏是一個awk解決方案:

awk -F "[][ =]" '/^\[/ { print $2, $13, $9 }' file 
  • 注意到的awk的解析線爲基礎領域的能力優勢在正則表達式中作爲分隔符 - 這裏是以下任何字符:[,], =
  • 只需按索引打印出感興趣的字段,即以[開頭的行。