2017-02-03 1 views
0

Derzeit habe ich ein Python-Programm, das ein Bash-Skript aufruft, um diese Protokolldatei, die JSON-Daten enthält, zu analysieren, aber jede Zeile enthält auch Nicht-JSON-Daten. Zum Beispiel hat jede Zeile dieses Format mit einem anderen JSON:Beste Methode zum JSON-Log-Datei mit Python/Bash zu analysieren?

<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0", "result": 1, "id": 1234}' 

Mein Ziel ist es zu zählen, kam die Anzahl der Male diese Meldung aufgetreten ist, möglicherweise die Anzahl der Male eine andere Nachricht in der Zeile nach diesem, und stellen Sie sicher, Es ist korrekt formatiert.

Ich habe ein Bash-Skript verwendet, grepping reguläre Ausdrücke, die im richtigen Format formatiert sind. Das Problem besteht also darin, dass JSON-Felder nicht in der richtigen Reihenfolge angezeigt werden. Daher funktioniert meine Regex nicht. Zum Beispiel kann die obige Zeile kommen kann:

<123>1 2017-01-23T10:53:56.111-11:12 blaa blaa '{"jsondata": "1.0","id": 1234, "result": 1}' 

kann ich es auch in Python mit json Decodern aber da diese Protokolldatei nicht um eine echte JSON-Datei ist, glaube ich nicht, dass das funktionieren würde. Was ist der beste, aber einfachste Weg, dies zu tun? Am besten mit Python oder einem Kommandozeilenskript. Ich bin in Ubuntu 16.04.

Meine erwartete Eingabe ist eine Protokolldatei mit Zeilen, die die gleichen wie oben sind. Meine erwartete Ausgabe ist in der Lage zu überprüfen, wie viele Zeilen wie oben formatiert sind, mit den gleichen Schlüsseln in beliebiger Reihenfolge und verschiedenen Werten, sowie zu prüfen, wie oft diese spezifische json-Nachricht aufgetreten ist (es gibt verschiedene json-Nachrichten in jeder Zeile)), auch wenn die JSON-Schlüssel nicht in der gleichen Reihenfolge sind.

+1

haben Sie alles versucht? – depperm

+0

Sie können eine Regex verwenden, um den JSON aus der Zeichenfolge zu extrahieren. Beispiel: r '(? P {. +?})' Diese Regex sollte nur mit dem JSON-Teil übereinstimmen. –

+0

Können Sie eine überprüfbare Eingabe und eine erwartete Ausgabe geben. Ihre aktuellen Informationen sind unklar. – Inian

Antwort

0

Ihre Protokolldatei zitiert die JSON-Daten. Verwenden Sie das zu Ihrem Vorteil, um eine Zeichenkette zu lesen, nicht die JSON mit Regex auseinanderziehen.

# 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']) 
+0

Während ich die Frage als Dupe geschlossen , das ist eine nützliche Antwort - geneigt, sie auf das andere Q zu übertragen? –

+0

Vielleicht, aber andere Frage hat nicht dasselbe Protokollformat. –

+0

Die Unterschiede erscheinen mir völlig trivial. Wenn es Zitate und Entführungen gab, die rückgängig gemacht werden mussten, konnte ich sehen, dass sie sinnvoll unterschieden wurden, aber das trifft mich hier nicht an - wenn wir dies als zwei verschiedene, sinnvoll getrennte Fragen akzeptierten, würden wir es tun müssen * jedes * eindeutige Muster von "wie extrahiere ich Inhalt aus einer Textzeile, einschließlich JSON?" wie es seiner eigenen eindeutigen Frage würdig ist. –

0

Hier ist ein Beispiel für die Analyse in Python zu tun:

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 
Verwandte Themen