2016-10-11 4 views
0

Linuxホストにstrace出力行を集約するプログラムを書いています。 straceのは「-f」オプションを付けて実行すると、システムを混在しますので、ラインを呼び出します。Pythonで効率的に行を結合する方法を探しています

close(255 <unfinished ...> 
<... rt_sigprocmask resumed> NULL, 8) = 0 
<... close resumed>)  = 0 
[pid 19199] close(255 <unfinished ...> 
[pid 19198] <... rt_sigprocmask resumed> NULL, 8) = 0 
[pid 19199] <... close resumed>)  = 0 

私は出力を反復処理し、ラインを「再開」と「未完成」の行を結合したいと思います。だから、次の2行以上の出力に:私は「>」で「未完」の行を分割し、リストの中にそれを置くことについて考えていた

close(255) = 0 

close(255 <unfinished ...> 
..... 
<... close resumed>)  = 0 

に統合されるだろう。将来の行にレジュームが含まれている場合は、このリストを繰り返してシステムコールとpidが存在するかどうかを確認します。もし私がそうなら、私は ">"で線を分割し()、2つを組み合わせます。これを行うより良い方法がある場合、興味がありますか?素晴らしいフィードバックのための

*更新*

ありがとう!私は次のように上がってきたコードで自分の考えを取得するのが大好きだ:

holding_cell = list() 

if len(sys.argv) > 1: 
    strace_file = open(sys.argv[1], "r") 
else: 
    strace_file = sys.stdin 

for line in strace_file.read().splitlines(): 
    if "clone" in line: 
     print line 
    if "unfinished" in line: 
     holding_cell.append(line.split("<")[0]) 
    elif "resumed" in line: 
     # Get the name of the system call/pid so we can try 
     # to match this line w/ one in the buffer 
     identifier = line.split()[1] 
     for cell in holding_cell: 
      if identifier in cell: 
       print cell + line.split(">")[1] 
       holding_cell.remove(cell) 
    else: 
     print line 

はこれを書くためのより多くの神託の方法はありますか?すばらしいフィードバックをいただきありがとうございます。

+0

なぜ、行ずつそれを読んであなたが未完成の行を見たときに別のバッファ、他の書き込みでそれを維持することではないかもしれませんあなたのバッファは、未完成の行に対応する完成した行が結合され、それを書き込んでバッファをクリアするよりも、複数の未完/仕上げブロックを管理することができます –

+0

これは実際に私が現在やっていることです。その点を明確にしていない私の謝罪。私は、どのようなタイプのバッファオプションが利用できるのか、そして2つのバッファオプションを効率的にマッチングさせる方法について、ほとんど興味があります。 – Shibby

+0

解決策を質問の中に投稿しないでください。それが与えられた答えと十分に異なる場合は、それを回答として投稿してください。これがtdelaneyのコードから派生している場合は、彼の答えを受け入れてください。コードレビュー - 作業コードの書き方について議論することは、[codereview.se]で最もよく尋ねられます。 – usr2564301

答えて

0

ファイルオブジェクトなどの一部のイテレータはネストすることができます。あなたがファイルのようなオブジェクトからこれを読んでいると仮定すると、結合を行うために内部ループを作成することができます。私はstraceログのフォーマット規則が何であるかわからないんだけど、名目上、それはのようなものが

def get_logs(filename): 
    with open('filename') as log: 
     for line in log: 
      if "<unfinished " in line: 
       preamble = line.split(' ', 1)[0].strip() 
       for line in log: 
        if " resumed>" in line: 
         yield "{}) = {}\n".format(preamble, 
          line.split('=')[-1].strip()) 
         break 
      else: 
       yield line 
+0

すばらしいフィードバックをありがとう。 – Shibby

関連する問題