2017-03-07 3 views
-1

私は、さまざまなユーザーについての行を含むログファイルを持っており、このファイルをリアルタイムでテーリングしています。 1234ログエントリは次のようになります。:私は元、唯一私が指定したユーザーに関連する行をフィルタリングする動的grepパターンでファイルをテールするにはどうすればよいですか?

ID:101 Username=1234 
ID:102 Username=1234 
ID:999 UNWANTED LINE (because this ID was not assigned to user 1234) 
ID:102 some log entry regarding the same user 
ID:123 UNWANTED LINE (because this ID was not assigned to user 1234) 
ID:102 some other text 
ID:103 Username=1234 
ID:103 blablabla 

動的なIDがID」のような行でユーザに割り当てられています:101 Username = 1234 "と表示されます。そのIDで始まる後続の行は、同じユーザーに関係し、表示する必要があります。

ID:101 Username=1234 
ID:102 Username=1234 
ID:102 some log entry regarding the same user 
ID:102 some other text 
ID:103 Username=1234 
ID:103 blablabla 

私が最初にここで、「ユーザ名= 1234」発見され、その後、行をフィルタリングする必要があります:私は次のように指定したユーザ(1234)に関連するすべてのIDを取得し、前の行にフィルタを適用することをダイナミック尾を必要とします"ID:???"を抽出するその行から "ID:???"を含むすべての行を検索します。 「Username = 1234」の別の行が見つかると、新しいIDを抽出し、それを使用して、この新しいIDで後続の行を表示します。

私はcatを使用するとgrepを連鎖させてIDをフィルタリングすることができますが、tailの後に連鎖すると機能しません。しかし、たとえできたとしても、IDの新しい価値を「見守って」、私のgrepパターンを動的に更新するにはどうすればよいですか?

ありがとうございます!

答えて

2

これは、Awkが簡単に処理できるタスクです(PerlやPythonでも処理できます)。

awk '$2 == "Username=1234" { ids[$1]++; } $1 in ids { print }' data 

第一のパターン/アクションペアは$2がアレイidsUsername=1234あるエントリのID:xxx値を記録します。 2番目のパターン/アクションのペアは、ID:xxxのエントリがidsにリストされているかどうかを調べます。そうであれば、行を出力します。 Username=1234行は両方の基準を満たしています(少なくともエントリが配列に追加された後)。

tailのように動作するように(つまり、データに追加された新しい行を印刷する)どうすれば使用できますか?

tail -f logfile | awk … 

もちろん、コマンドのawk一部データファイルの名前を逃すと思います。あなたが気をつけなければならないのは、パイプバッファーを満たすのを待っている間にテールがハングアップしないということだけです。おそらく問題はありませんが、Awk入力に予想よりも長い行が表示されるようにするには、tailのオプションを熟考しなければならないかもしれません。

私は、ID:XXXが必ずしも常に$ 1の位置にあるとは認識しませんでした。その行の位置($ 1、$ 2、..)に関係なく、IDを正規表現に一致させる方法はありますか? )?

はい:

awk '$2 == "Username=1234" { ids[$1]++; } 
    { for (i = 1; i <= NF; i++) if ($i in ids) { print; break }' data 

二行目は、すべての行に一致し、行の各フィールドについて、そのフィールドは、ids配列中に存在するかどうかをチェックします。そうであれば、行を印刷してループから抜け出します(この文脈ではbreakの代わりにnextを使用できますが、2つは一般的に同等です)。

+0

ありがとうございました!それはまさに私が探しているものと思われる!しかし、それをどのように使用して末尾のように機能させることができますか(つまり、データに追加される新しい行を印刷しますか?) –

+0

'tail -f logfile |を使用してください。 awk ... '無期限に読み続ける。 –

+0

あなたは素晴らしいです!それはまさにそれです!ちょうど1つの最後のこと...私はID:XXXが必ず$ 1の位置に来るとは限りません...行内の位置($ 1、$ 2、...)に関係なく正規表現とIDを一致させる方法があることを認識しました。 ..)? –

関連する問題