使用python/bash解析JSON日志文件的最佳方法?

使用python/bash解析JSON日志文件的最佳方法?,python,json,bash,parsing,logging,Python,Json,Bash,Parsing,Logging,目前,我有一个python程序,它调用一个bash脚本来解析这个包含json数据的日志文件,但每一行上都有非json数据。例如,每一行都使用不同的JSON格式: <123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0", "result": 1, "id": 1234}' 12017-01-23T10:53:56.111-11:12 blaa blaa blaa'{“jsondata”:“1.0”,“res

目前,我有一个python程序,它调用一个bash脚本来解析这个包含json数据的日志文件,但每一行上都有非json数据。例如,每一行都使用不同的JSON格式:

<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0", "result": 1, "id": 1234}'
12017-01-23T10:53:56.111-11:12 blaa 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}'
12017-01-23T10:53:56.111-11:12 blaa blaa blaa'{“jsondata”:“1.0”,“id”:1234,“result”:1}”
我也可以在python中使用json解码器来实现这一点,但由于这个日志文件不是真正的json文件,所以我认为这是行不通的。最好但最简单的方法是什么?最好使用python或一些命令行脚本。我在Ubuntu 16.04中


我的预期输入是一个日志文件,其中的行与上面的相同。我期望的输出是能够检查有多少行是如上所述的格式,以任何顺序使用相同的键和不同的值,以及检查特定的json消息发生了多少次(每行上有不同的json消息),即使json键的顺序不同。

您的日志文件引用的是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'])
#编码=utf8
导入re、json
regex=r“\\d\d+-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}-\d{2}:\d{2}(?:[\w]+)'([^']+)”
test_str=“1 2017-01-23T10:53:56.111-11:12 blaa blaa”{“jsondata\”:“1.0\”,“id\”:1234,“result\”:1}”
对于有关findall(正则表达式,test_str)的匹配:
j=json.load(匹配)
打印(j['id'])

您的日志文件引用了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'])
#编码=utf8
导入re、json
regex=r“\\d\d+-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}-\d{2}:\d{2}(?:[\w]+)'([^']+)”
test_str=“1 2017-01-23T10:53:56.111-11:12 blaa blaa”{“jsondata\”:“1.0\”,“id\”:1234,“result\”:1}”
对于有关findall(正则表达式,test_str)的匹配:
j=json.load(匹配)
打印(j['id'])

下面是一个用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
重新导入
导入json
s=“”1 2017-01-23T10:53:56.111-11:12 blaa blaa blaa'{“jsondata”:“1.0”,“id”:1234,“result”:1}'”
yourDict=json.loads(重新搜索(“(\{.+\})”,s)[0])
yourDict['id']
>> 1234
yourDict[“结果”]
>>> 1
yourDict['jsondata']
>>> 1.0

下面是一个用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
重新导入
导入json
s=“”1 2017-01-23T10:53:56.111-11:12 blaa blaa blaa'{“jsondata”:“1.0”,“id”:1234,“result”:1}'”
yourDict=json.loads(重新搜索(“(\{.+\})”,s)[0])
yourDict['id']
>> 1234
yourDict[“结果”]
>>> 1
yourDict['jsondata']
>>> 1.0


您尝试过什么吗?您可以使用正则表达式从字符串中提取JSON。示例:r'(?P{.+?})表示正则表达式应该只与JSON部分匹配。您能否给出可验证的输入和预期的输出。您当前的信息不清楚。是的,我写过,我尝试使用与JSON匹配的正则表达式进行grepping,但JSON键可能出现顺序错误,因此这不会一直起作用。我还写道,我希望能够计算某个JSON消息出现的次数,并查看该jsonA中是否存在所有正确的键类似的问题,使用
jq
首先从文本字符串中解析JSON,然后将其解释为JSON,问:您尝试过什么吗?您可以使用正则表达式从字符串中提取JSON。示例:r'(?P{.+?})表示正则表达式应该只与JSON部分匹配。您能否给出可验证的输入和预期的输出。您当前的信息不清楚。是的,我写过,我尝试使用与JSON匹配的正则表达式进行grepping,但JSON键可能出现顺序错误,因此这不会一直起作用。我还写道,我希望能够计算某个JSON消息出现的次数,并查看该jsonA中是否有所有正确的键类似的问题,使用
jq
首先从文本字符串中解析JSON,然后将其解释为JSON,在我以重复方式结束问题时被询问,这是一个有用的答案——倾向于将它移到另一个Q?也许,但另一个问题没有相同的日志格式。我觉得这些差异完全是微不足道的。如果有引用和转义必须撤销,我可以看到它们被有效地区分,但我在这里并不是这么认为的——如果我们接受这两个不同的、有用的问题,我们需要接受每一个不同的模式“如何从包含一些JSON的文本行中提取内容?”这是一个很有用的答案——我倾向于把它移到另一个问题上?也许吧,但另一个问题没有相同的日志格式。这些差异让我觉得完全微不足道。如果有引用和转义必须撤销,我可以看到它们被有效地区分,但我在这里并不是这么认为的——如果我们接受这两个不同的、有用的问题,我们需要接受每一个不同的模式“如何从包含一些JSON的文本行中提取内容?”因为它值得提出自己独特的问题。谢谢。这个答案应该被标记为正确。我有一个类似的问题,我需要找到json,其中每个键值都在一行中。“”“1 2017-01-23T10:53:56.111-11:12 blaa blaa blaa\n{“key1”:“value”、\n“key2”:“value2”、\n“key3”:“value3”}谢谢。此答案应标记为正确。我有一个类似的问题,我需要在每个键值所在的位置找到json。”