0

いくつかのログ ファイルを含む "/pcap_test" ディレクトリがありました。各ファイルには次のようなパターンがあります。

パケット: 1 (358 バイト)、LIFE: 1、アプリ: itunes (INTO)、状態: TERMINATED、スタック: /ETH/IP/UDP/itunes、エラー: なし

Pkt: 2 (69 バイト)、LIFE: 2、アプリ: zynga (INTO)、状態: INSPECTING、スタック: /ETH/IP/UDP、エラー: なし

パケット: 3 (149 バイト)、ライフ: 2、アプリ: ピッツェリア (INTO)、状態: 終了、スタック: /ETH/IP/UDP/ピッツェリア、エラー: なし

この場合、「App」のコンテンツが「Stack:」に存在しないため、出力を 2 行目に表示したいと考えています。

ディレクトリを反復処理し、各ファイルを開いて出力を出力する小さな Python スクリプトを作成しました。

import os
list = os.listdir("/home/test/Downloads/pcap_test")
print list
for infile in list:
  infile = os.path.join("/home/test/Downloads/pcap_test" , infile)

if os.path.isfile(infile):
str = file(infile, 'r').read()
print str

どういうわけかgrepを使用して出力を取得しましたが、Pythonスクリプトで同じものを使用できません。そのようなもの:

grep -vP 'App: ([^, ]*) \(INTO\).*Stack: .*\1.*$' xyz.pcap.log | grep -P 'App: ([^, ]*) \(INTO\)'

"str" という名前のファイルが既にあるので、個々のログ ファイルではなく、それを使用して出力を取得します。

この点でどんな助けも高く評価されます。

4

1 に答える 1

0

まず、プリミティブ データ型strに対する Python の名前のような変数名は使用しないことをお勧めします。String

grep はコマンドラインの正規表現ツールであり、既に機能する正規表現を持っているので、必要なのは Python のreモジュールの使い方を学ぶことだけです。

少し難しいのは、grep の-v動作をキャプチャすることです。次のように、ファイルを 1 行ずつ読み取り、最初の正規表現と一致しないが 2 番目の正規表現と一致する場合にのみ、その行を出力することをお勧めします。

if os.path.isfile(infile):
    with file(infile, 'r') as logFile: #this will close the file pointer automatically when you finish
        for line in logFile: #read logFile one line at a time
            firstReMatch = re.match(r'App: ([^, ]*) \(INTO\).*Stack: .*\1.*$', line) #check if this line matches your first regex
            secondReMatch = re.match(r'App: ([^, ]*) \(INTO\)', line) #check if this line matched your second regex
            if secondReMatch and not firstReMatch: #"not" to capture the inverse match
                print line #print the line.

データによっては、代わりに使用したい場合がありますre.search()re.match()

于 2013-02-19T07:23:43.157 に答える