目前,我有一个python程序,它调用一个bash脚本来解析这个CONTAINS json数据的日志文件,但每行也有非json数据。例如,每一行都具有不同JSON的格式:
<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0", "result": 1, "id": 1234}'
我的目标是计算此消息发生的次数,可能是此后该行中另一条消息发生的次数,并确保其格式正确。
我一直在使用bash脚本,使用格式化为正确格式的正则表达式。所以问题是JSON字段可能无序,所以我的正则表达式不起作用。例如,上面的行可能是:
<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0","id": 1234, "result": 1}'
我也可以使用json解码器在python中完成它,但由于这个日志文件不是真正的JSON文件,我认为这不会起作用。什么是最好但最简单的方法呢?最好使用python或一些命令行脚本。我在Ubuntu 16.04。
我的预期输入是一个日志文件,其中的行与上面的行相同。我的预期输出是能够检查上面格式化的行数,任意顺序的相同键,不同的值,以及检查特定json消息发生的次数(每行有不同的json消息) ),即使JSON键的顺序不同。
答案 0 :(得分:1)
这是在python中进行解析的一个例子:
import re
import json
s = """<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata":"1.0","id": 1234, "result": 1}'"""
yourDict = json.loads(re.search('(\{.+\})', s)[0])
yourDict['id']
>> 1234
yourDict['result']
>>> 1
yourDict['jsondata']
>>> 1.0
答案 1 :(得分:0)
您的日志文件引用了JSON数据。使用它有利于读取字符串,而不是使用正则表达式拆分JSON。
# coding=utf8
import re, json
regex = r"\<\d+\>\d \d+-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}-\d{2}:\d{2} (?:[\w ]+)'([^']+)'"
test_str = "<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{\"jsondata\": \"1.0\",\"id\": 1234, \"result\": 1}'"
for match in re.findall(regex, test_str):
j = json.loads(match)
print(j['id'])