【发布时间】:2016-08-24 21:26:44
【问题描述】:
我需要获取两个时间戳 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.63,39713" nat.csv.2016032112.csv.gz
输出:(返回2条记录)
2016-03-21T11:01:13.054-04:00,2,172.21.63.13,49766,17.167.195.12,443,192.168.224.63,39713,6,16,1438,13,6506 2016-03-21T11:31:16.528-04:00,54,172.21.63.24,59014,77.68.41.125,51900,192.168.224.63,39713,6,182,236501,125,6437
有了这个,我可以解析字段以返回 IP 地址和端口号以供其他用途。由于我想要一个范围之间的数据,时间戳 A 和时间戳 B 之间的数据,我想过滤该范围之外的任何内容。
编辑 2 提供的参数
ip address: 192.168.224.154
port: 36715
log: nat.csv.2016032100.csv.gz
start: 2016-03-20T23:12:00
end: 2016-03-20T23:22:00
输入
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 命令来解析我需要的记录。另外,为了限制结果。
【问题讨论】:
-
您的代码实际执行的操作与您希望执行的操作有何不同?
-
我曾经有一个查询,它需要一个时间戳并返回日志中的确切记录。我当时用了grep。 query = ["zgrep", "'", ip_address, ",", port_number, "'", log_file] query = "".join(query) records.append([subprocess.Popen(query, shell = True, stdout = subprocess.PIPE).stdout.read()]) 但是,现在我们想看看日志中两个日志时间戳之间发生了什么。我不相信 grep 是处理范围的最佳方式。我看到网上有人使用 sed 或 awk 命令。我以前从未使用过其中任何一个。现在什么都没有显示。
-
第二个 if 语句应设置
p=0以使其按预期工作。如果您的日志已被订购,则最好在此时退出。