正規表現と行の分割を使用した他の回答は仕事を終わらせますが、あなたと共に成長する完全に保守可能なソリューションが必要な場合は、文法を構築する必要があります. 私はこれが大好きpyparsing
です:
S ='''
7:06:32 (slbfd) IN: "lq_viz_server" aqeela@nabltas1
7:08:21 (slbfd) UNSUPPORTED: "Slb_Internal_vlsodc" (PORT_AT_HOST_PLUS ) Albahraj@nabwmps3 (License server system does not support this feature. (-18,327))
7:08:21 (slbfd) OUT: "OFM32" Albahraj@nabwmps3'''
from pyparsing import *
from collections import defaultdict
# Define the grammar
num = Word(nums)
marker = Literal(":").suppress()
timestamp = Group(num + marker + num + marker + num)
label = Literal("(slbfd)")
flag = Word(alphas)("flag") + marker
name = QuotedString(quoteChar='"')("name")
line = timestamp + label + flag + name + restOfLine
grammar = OneOrMore(Group(line))
# Now parsing is a piece of cake!
P = grammar.parseString(S)
counts = defaultdict(int)
for x in P:
if x.flag=="IN": counts[x.name] += 1
if x.flag=="OUT": counts[x.name] -= 1
for key in counts:
print key, counts[key]
これにより、次の出力が得られます。
lq_viz_server 1
OFM32 -1
サンプル ログ ファイルがもっと長いと、より印象的になります。pyparsing ソリューションの優れた点は、将来、より複雑なクエリに適応できることです (例: タイムスタンプの取得と解析、電子メール アドレスのプル、エラー コードの解析など)。アイデアは、クエリとは独立して文法を記述することです。生のテキストをコンピューターに適した形式に変換するだけで、構文解析の実装をその使用法から切り離して抽象化できます。