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