2011-05-06 51 views
2

我有格式化像一個文件:選擇每行一個值 - awk的

10.0.0.1  87.220.150.64 131 
10.0.0.1  87.220.172.219 131 
10.0.0.1  87.220.74.162 131 
10.0.0.1  87.220.83.17 58 
10.0.0.1  87.220.83.17 58 
1.160.138.209 10.0.0.249  177 
1.160.138.209 10.0.0.249  354 
1.160.138.249 10.0.0.124  296 
1.160.139.125 10.0.0.252  129 
1.160.139.207 10.0.0.142  46 

第一和第二列是IP地址,第三個是IP地址之間傳送的字節。我必須計算每個IP地址發送或接收的東西數量。

我使用下面的awk程序來計算每個IP發送了多少字節,但我無法弄清楚如何編輯它以計算接收到的字節。

awk '{ a[$1 " " $2] += $3 } END { for (i in a) { print i " " a[i] } }' input.txt | sort -n 

回答

3

這不區分發送的字節和接收到的字節。

# bytes-txrx.awk -- print bytes sent or received by each 10.* ip address. 
# Does not guard against overflow. 
# 
# Input file format: 
# 10.0.0.1  87.220.150.64 131 
# 10.0.0.1  87.220.172.219 131 
# 10.0.0.1  87.220.74.162 131 
# 10.0.0.1  87.220.83.17 58 
# 10.0.0.1  87.220.83.17 58 
# 1.160.138.209 10.0.0.249  177 
# 1.160.138.209 10.0.0.249  354 
# 1.160.138.249 10.0.0.124  296 
# 1.160.139.125 10.0.0.252  129 
# 1.160.139.207 10.0.0.142  46 
# 
$1 ~ /^10\./ {a[$1] += $3;} 
$2 ~ /^10\./ {a[$2] += $3;} 
END { 
    for (key in a) { 
    print key, a[key]; 
    } 
} 

$ awk -f test.awk test.dat 
10.0.0.1 509 
10.0.0.252 129 
10.0.0.249 531 
10.0.0.142 46 
10.0.0.124 296 
+2

+1。我會用正則表達式更具體一些:'$ 1〜/^10 \ ./'和'$ 2〜/^10 \ ./' – 2011-05-06 16:34:30

+0

好點。我納入了這一變化。 – 2011-05-06 16:52:41

0

只是排序列2和你有它:

$ awk '{ a[$1 " " $2] += $3 } END { for (i in a) { print i " " a[i] } }' input.txt | sort -n -k 2 

但是你的描述不符計算。你不計算IP發送多少。您計算從A發送到B的數量。A發送的數量與B收到的數量相同。