Python

ログ解析を爆速で行うPythonテンプレ

More than 1 year has passed since last update.

あらまし

仕事中、開発機から出力される、 自分以外の人が入れた フリーフォーマットなログを解析することがよくある。
毎回それに合わせてログ解析コードを書くわけだが、何度もログ解析をするうちに捗るテンプレートとテクニックができたので展開する。

テンプレートコード

#!/usr/bin/env python3

import sys,re

for line in sys.stdin: # 標準出力から読み込む
    line = line.strip() # 行頭、行末の空白、改行は削っておく
    print(line)

たったこれだけ!

上記コードはPython3で書かれているが、Python2でもShebangとprint関数がprint文になる以外は変わらない。

使用例とテクニック

テンプレを用いて、行の解析や集計を行ってみる。

#!/usr/bin/env python3

import sys,re # 標準入力、正規表現を扱う

# 行をまたぐ情報はここで宣言した変数に格納する。
hoge_count = 0

# 行ごとにループを回す
for line in sys.stdin:
    line = line.strip()
    # print(line) # デバッグ用、要らなければコメントアウトする

    # 特定の文字列で始まる行を探すなら、正規表現より.startwith()が便利
    if line.startswith('hoge'):
      hoge_count += 1

    if line.startswith('fuga'):
      # 次の行を先読みしたいなら、.readline()を呼ぶ
      next_line = sys.stdin.readline().strip()
      print("next to fuga =", next_line)

    # 空白やカンマ区切りは.split()を使う
    if line.startswith('moge'):
       moge_cols = line.split(' ')
       print("moge line cols =", moge_cols)

    # 複雑なマッチは正規表現を使う
    m = re.match('(.*)_muga_(.*)', line)
    if m:
       print("muga line left: ", m.group(1), "right:", m.group(2))

# 集計結果の出力
print("hoge_count =", hoge_count)

こんな入力を食わせてみる。

input.txt
hoge1
hoge2
fuga
next fuga
moge 1 2 3
left_muga_right
実行
$ python3 analyze.py < input.txt

こんな入力が得られる。

output
next to fuga = next fuga
moge line cols = ['moge', '1', '2', '3']
muga line left:  left right: right
hoge_count = 2

同じく、Python2でも同等のコードは記述可能である。

まとめ

5分でログ解析を行うためのコードテンプレートとテクニックを紹介した。
Python3で記述したが、Python2でも可能である。