awk -v tp1=$tp1 -v tp2=$tp2 '$1 > tp1 && $1 < tp2 {
total[$2] += $3;
}
END {
for (ip in total)
print "IP:", ip, "=>", total[ip];
}'
看起来很简单。如果这对你不起作用,它在什么方面不起作用?
编辑:重新格式化。缩进被忽略了,不知道为什么。
解释:
-v tp1=$tp1
意思是“在名为tp1的 awk 中使用名为tp1的 shell 变量的值创建变量。
$1 > tp1 && $1 < tp2
意思是“仅当第一个字段的值大于tp1的值且小于tp2的值时才执行此代码块。
total[$2] += $3;
使用第二个字段(IP 地址)的值作为隐式声明的名为“tota”的数组的数组索引,并添加第三个字段的值。
- AWK 将遍历输入中的所有记录,默认记录是单行文本。对于每条记录,如果条件成立,就会执行上面的代码。
END
标识在处理完所有记录后执行的代码块,而不是针对每个(匹配的)输入记录执行。
for (ip in total)
标识另一个迭代器:对于存储在数组 named 中的每个值total
,将数组索引的名称分配给变量 named ip
,并执行相关的代码块。
- 在这种情况下,相关的代码块是
print "IP:", ip, "=>", total[ip];
,它打印字符串“IP:”,一个空格,如果变量命名ip
(这是一个 IP 地址,用作数组索引名称)的值,另一个空格,字符串“= >”,另一个空格,以及存储在total
由 IP 地址索引的数组中的值。
任何问题?