我需要得到两个时间戳1到时间戳2之间的所有记录。 下面是两个时间戳的示例:2016-03-21T11:20:27、2016-03-21T11:40:27
以下是我尝试过的:
import subprocess
query = '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/ \
{ \
if ($1T$2 >= "2016-03-21T11:20:27") p=1; \
if ($1T$2 >= "2016-03-21T11:40:27") p=2; \
} \
p {print $0}'
output = subprocess.Popen(['awk', query,'nat.csv.2016032112.csv.gz'],stdout=subprocess.PIPE).communicate()[0]
我不知道我错过了什么。在
编辑:来自zgrep命令的输入和输出
命令: zgrep“192.168.224.6339713”国家标准.csv.2016032112号。csv.gz版在
输出:(返回2条记录)
2016-03-21T11:01:13.054-04:00,2172.21.63.1349766,17.167.195.12443192.168.224.6339713,6,161438,136506 2016-03-21T11:31:16.528-04:00,54172.21.63.2459014,77.68.41.12551900192.168.224.6339713,61822365011256437
有了这个,我可以解析这些字段以返回ip地址和端口号以供其他用途。因为我想要一个范围之间的数据,时间戳a和时间戳B之间的数据,所以我想过滤掉这个范围之外的任何东西。在
编辑2 提供的参数
^{pr2}$输入
2016-03-20T23:00:01.671-04:00,60,172.21.154.211,40500,24.43.1.206,18313,192.168.224.154,36715,17,2,454,1,129
2016-03-20T23:12:22.714-04:00,16,172.21.154.161,61130,31.13.73.7,80,192.168.224.154,36715,6,4,172,2,92
结果提供人:
zgrep "192.168.224.154,36715" nat.csv.2016032100.csv.gz
输出
2016-03-20T23:12:22.714-04:00,16,172.21.154.161,61130,31.13.73.7,80,192.168.224.154,36715,6,4,172,2,92
不应返回第一条记录。很难找到好的例子,大多数返回2个记录。在
这是多大的木头
2016-03-20T23:00:01.671-04:00 19 172.21.128.70 61807 154.70.22.157 15702 192.168.224.128 61065 6 3 152 0 0
2016-03-20T23:00:01.671-04:00 19 172.19.172.152 57681 189.110.82.196 1024 192.168.226.172 41197 6 3 152 0 0
2016-03-20T23:00:01.671-04:00 19 172.19.165.121 24598 222.89.181.20 9094 192.168.226.165 32628 6 5 300 0 0
2016-03-20T23:00:01.671-04:00 19 172.25.47.36 58797 192.168.0.6 49201 192.168.244.2 36050 6 7 448 0 0
2016-03-20T23:00:01.671-04:00 19 172.19.165.121 24254 114.228.60.157 58782 192.168.226.165 51470 6 1 60 0 0
2016-03-20T23:00:01.671-04:00 4 172.19.168.238 57419 8.8.4.4 53 192.168.226.168 51143 17 1 60 1 76
2016-03-20T23:00:01.671-04:00 4 172.21.134.249 58220 8.8.4.4 53 192.168.224.134 50374 17 1 68 1 267
2016-03-20T23:00:01.671-04:00 3 172.19.131.110 52480 156.154.70.22 53 192.168.226.131 53024 17 1 68 1 166
2016-03-20T23:00:01.671-04:00 3 172.19.131.110 64935 156.154.70.22 53 192.168.226.131 53193 17 1 67 1 155
2016-03-20T23:00:01.671-04:00 68 172.19.212.211 52537 31.13.73.1 443 192.168.226.212 62342 6 24 4426 20 5142
2016-03-20T23:00:01.671-04:00 77 172.19.170.63 51375 104.73.87.51 443 192.168.226.170 54179 6 9 860 7 553
2016-03-20T23:00:01.671-04:00 43 172.19.170.63 60547 23.15.135.11 80 192.168.226.170 42232 6 5 212 4 585
2016-03-20T23:00:01.671-04:00 44 172.19.170.63 60530 23.15.135.18 80 192.168.226.170 47914 6 5 212 4 585
2016-03-20T23:00:01.671-04:00 73 172.19.153.239 54157 199.16.156.6 443 192.168.226.153 42815 6 16 4429 12 6298
2016-03-20T23:00:01.671-04:00 76 172.19.170.63 51393 104.73.87.51 443 192.168.226.170 58126 6 9 1407 7 862
2016-03-20T23:00:01.671-04:00 6 172.21.155.59 57297 54.225.73.60 80 192.168.224.155 45142 6 7 980 6 897
2016-03-20T23:00:01.671-04:00 7 172.21.155.59 57283 8.43.72.32 80 192.168.224.155 55636 6 9 4855 7 868
2016-03-20T23:00:01.671-04:00 7 172.21.155.59 57275 23.235.39.175 80 192.168.224.155 58325 6 33 3674 44 59257
2016-03-20T23:00:01.671-04:00 6 172.21.155.59 57304 23.21.59.91 80 192.168.224.155 49043 6 7 2921 6 2384
我使用zgrep命令解析我需要的记录。另外,为了限制结果。在
感谢Ed Morton和karakfa的反馈。在
以下是终端中运行的命令:
终端命令
结果(未过滤,无awk)
^{pr2}$结果(过滤,使用awk)
下面是python代码:
有一个明确的问题是,
$1T$2
将$1与一个未初始化的变量(因此是一个值为0或-NULL的数值字符串)的内容连接起来,然后是$2,这样它就和执行$1$2
相同。你可能是说$1"T"$2
:我做了一点小小的调整,让它看起来更古怪。在
不太可能的问题是一些awk可能不理解
{2}
(例如,没有re-interval
的4.0gnu awk)。在话虽如此:原谅你的无知,但你为什么要打电话给awk?python没有读取文件和比较文本的方法吗?在
另外,如果
nat.csv.2016032112.csv.gz
是您试图用作awk输入的文件名,那么如果该文件真的是gzip压缩的(从.gz
后缀猜测)就会有问题,因为awk只在文本文件上运行。在考虑到您的更新问题,我认为这可能是您希望从awk脚本:
^{pr2}$当你说“between”是指包含或排除与起始值和/或结束值匹配的行时,就不清楚了。无论你需要什么,你只要重新排序或调整上面最后3行的数学来完成。在
根据我现在对您的输入格式的了解,您真正需要的是:
您可以重写awk脚本如下
也可以将时间戳regex匹配委托给zgrep。在
相关问题 更多 >
编程相关推荐