shell中的复杂查询
我有一个包含许多条目的文件,如shell中的复杂查询,shell,debian,Shell,Debian,我有一个包含许多条目的文件,如 1365593957.914 172.27.15.16 593 1365593969.237 172.27.15.31 1149 1365593979.239 172.27.15.33 5696 1365593989.242 172.27.15.31 1338 1365593999.344 172.27.15.33 21406 这些是时间戳ip数据大小 如果时间戳介于$tp1和$tp2之间,我需要每个ip的所有数据量之和。我尝试逐行读取文件,然后在每行应用awk
1365593957.914 172.27.15.16 593
1365593969.237 172.27.15.31 1149
1365593979.239 172.27.15.33 5696
1365593989.242 172.27.15.31 1338
1365593999.344 172.27.15.33 21406
这些是时间戳ip数据大小
如果时间戳介于$tp1
和$tp2
之间,我需要每个ip的所有数据量之和。我尝试逐行读取文件,然后在每行应用awk来检查时间戳的范围,但它不起作用。另外,我也不知道如何将它们分类相加。awk-vtp1=$tp1-vtp2=$tp2'$1>tp1&&1awk -v tp1=$tp1 -v tp2=$tp2 '$1 > tp1 && $1 < tp2 {
total[$2] += $3;
}
END {
for (ip in total)
print "IP:", ip, "=>", total[ip];
}'
总额[$2]+=$3;
}
结束{
用于(ip总数)
打印“IP:”,IP“=>”,总[IP];
}'
看起来很简单。如果这对你不起作用,它在什么方面不起作用
编辑:重新格式化。缩进被忽略了,不知道为什么
说明:
表示“在awk中创建名为tp1的变量,并使用名为tp1的shell变量的值-v tp1=$tp1
表示“仅当第一个字段的值大于tp1的值且小于tp2的值时才执行此代码块$1>tp1&$1
使用第二个字段(IP地址)的值作为数组索引,隐式声明名为“tota”的数组,并添加第三个字段的值total[$2]+=$3
- AWK将迭代输入中的所有记录,默认记录为单行文本。对于每条记录,如果条件有效,将执行上述代码
标识在处理完所有记录后执行的代码块,而不是针对每个(匹配的)输入记录执行END
标识另一个迭代器:对于名为for(ip总计)
的数组中存储的每个值,将数组索引的名称分配给名为total
的变量,并执行关联的代码块ip
- 在这种情况下,关联的代码块是
,它打印字符串“IP:”、一个空格、名为print“IP:,IP,=>,total[IP]
的变量(这是一个IP地址,用作数组索引名)的值、另一个空格、字符串“=>”、另一个空格以及存储在数组中的值,这些值由IP地址索引IP
有问题吗?重新格式化。一个恰当的解释在评论中是不合适的,你还需要它吗?如果你也可以不加评论地解释它,那就行了。非常感谢。