从python命令到日志中的所有记录的时间戳范围

2024-04-25 13:45:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要得到两个时间戳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命令解析我需要的记录。另外,为了限制结果。在


Tags: csv数据import命令编辑示例if记录
3条回答

感谢Ed Morton和karakfa的反馈。在

以下是终端中运行的命令:

终端命令

zgrep "192.168.224.63,39713" nat.csv.2016032112.csv.gz | awk -F, -v OFS=, '{key=$1"T"$2} key >= "2016-03-21T11:20:27" {p=1} key >= "2016-03-21T11:40:27" {exit} p'

结果(未过滤,无awk)

^{pr2}$

结果(过滤,使用awk)

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   

下面是python代码:

import subprocess

ip_address = '192.168.224.63'
port_number = '39713'
log_file = 'nat.csv.2016032112.csv.gz'
start_time = '2016-03-21T11:20:27'
stop_time = '2016-03-21T11:40:27'

terminal_commands = {}
terminal_commands['zgrep'] = ["zgrep", " '", ip_address, ",", port_number, "' ", log_file]
terminal_commands['awk'] = ["awk -F, -v OFS=, '{key=$1\"T\"$2} key >= \"",start_time,"\" {p=1} key >= \"",stop_time,"\" {exit} p'"]

query_commands = {}
query_commands['zgrep'] = ''.join(str(x) for x in terminal_commands['zgrep'])
query_commands['awk'] = ''.join(str(x) for x in terminal_commands['awk'])
query_commands['run_query'] = '|'.join((query_commands['zgrep'], query_commands['awk']))

records = []
records.append([subprocess.Popen(query_commands['run_query'], shell = True, stdout = subprocess.PIPE).stdout.read()])
print records

有一个明确的问题是,$1T$2将$1与一个未初始化的变量(因此是一个值为0或-NULL的数值字符串)的内容连接起来,然后是$2,这样它就和执行$1$2相同。你可能是说$1"T"$2

query = '/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/ \
{ \
    if ($1"T"$2 >= "2016-03-21T11:20:27") p=1; \
    if ($1"T"$2 >= "2016-03-21T11:40:27") p=2; \
} \
p'

我做了一点小小的调整,让它看起来更古怪。在

不太可能的问题是一些awk可能不理解{2}(例如,没有 re-interval的4.0gnu awk)。在

话虽如此:原谅你的无知,但你为什么要打电话给awk?python没有读取文件和比较文本的方法吗?在

另外,如果nat.csv.2016032112.csv.gz是您试图用作awk输入的文件名,那么如果该文件真的是gzip压缩的(从.gz后缀猜测)就会有问题,因为awk只在文本文件上运行。在

考虑到您的更新问题,我认为这可能是您希望从awk脚本:

^{pr2}$

当你说“between”是指包含或排除与起始值和/或结束值匹配的行时,就不清楚了。无论你需要什么,你只要重新排序或调整上面最后3行的数学来完成。在

根据我现在对您的输入格式的了解,您真正需要的是:

awk '$0>="2016-03-20T23:12:00"{p=1} p; $0>="2016-03-20T23:22:00"{p=0}'

您可以重写awk脚本如下

awk -F, -v OFS=, '{key=$1"T"$2}
         key >= "2016-03-21T11:20:27" {p=1}
         key >= "2016-03-21T11:40:27" {exit}
         p'

也可以将时间戳regex匹配委托给zgrep。在

相关问题 更多 >