2017-02-03 10 views
0

現在のところ、jsonデータを含むこのログファイルを解析するためのbashスクリプトを呼び出すpythonプログラムがありますが、各行には非jsonデータもあります。たとえば、すべての行が異なるJSONと、この形式になっています。Python/bashで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キーが同じ順序でなくても。

+1

は、あなたが何かを試してみましたか? – depperm

+0

正規表現を使用して、文字列からJSONを抽出することができます。 例:r '(?P {。+?})' 正規表現はJSON部分にのみ一致する必要があります。 –

+0

検証可能な入力と期待される出力を提供できますか?あなたの現在の情報は不明です。 – Inian

答えて

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

私は二重引用符として質問を閉じているうちにこれは有用な答えです - それを他のQに移動する傾向がありますか? –

+0

おそらく、他の質問に同じログ形式がありません。 –

+0

その違いはまったく些細なものです。引用符をつけて取り消しをしなければならなかった場合、私はそれらを有効に区別することができますが、それは私の場合のように私を打つことはありません - これらを2つの異なる、 「JSONを含むテキストの行からコンテンツを抽出するにはどうすればよいですか?」という別々のパターンをすべて受け入れる必要があります。それ自身の明確な疑問にふさわしいものとして。 –

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 
関連する問題