2017-05-16 20 views
0

私は、さまざまなスレッドの実行開始時刻と終了時刻を含むログファイルを持っています。私は仕事の半分をやったが、残りの半分を終わらせるためにいくつかの助けが必要だ。この出力は、最後の列であるプロセスIDでソートされログファイルからフィールドの最初と最後のオカレンスを見つける方法は?

15 May 2017 03:43:40 696 
15 May 2017 03:44:35 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:49:40 9502 
15 May 2017 23:50:50 9502 
15 May 2017 23:51:11 9502 
15 May 2017 23:52:11 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:19:35 12795 
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:13 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:53:01 19143 
15 May 2017 18:53:35 19143 
15 May 2017 18:53:59 19143 
15 May 2017 18:54:40 19143 

:私は、これは次の出力を生成

cat 2017-05-15.log | grep 'Executing ETL' | tr -s ' ' | cut -f2,3,4,5,8 -d' ' | sort -k5 -n 

をコマンド - 書きました。各プロセスIdの最初の発生は、そのプロセスの開始時間であり、最後の発生は、同じ終了時間である。 各プロセスの最初の(開始時刻)と最後の(終了時刻)のみを表示する必要があります。このように:

15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795 
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 

各プロセスIDのエントリの数は、に固定されていません。出力は厳密にこの形式である必要はありません。しかし、私は、各プロセスの開始時刻と終了時刻を明確に見ることができる必要があります。

+0

説明したように、最初のステップで生成する出力は、プロセスID(5番目の列)でソートされます。 – RodrikTheReader

+0

エントリが1つだけの場合はどうなりますか? –

答えて

2

PIDが混ざり合わない場合、これはやや単純です。 最後の行とその行のPIDを追跡し、変更があったときに最後の行と現在の行を表示します。 (lastが空の場合はそうでない我々が開始する空の行を取得し、印刷をスキップし、ENDで非常に最後の行を印刷することを忘れないでください。)

$ awk '($5 != lastpid) { if (last) print last; print $0; } 
     { lastpid = $5; last = $0 } 
     END {print last }' < times 
15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 
+0

ファイル** 2017-05-15.log **に質問に記載されているデータ形式が含まれていると想定していますが、これは正しくありません。このファイルには実際には偽のデータがたくさん含まれていますが、これは "cat 2017-05-15.log | grep"によって削除されました。ETL '| tr -s' '| cut -f2,3,4,5,8 -d' '| sort -k5 -n " 私のコマンドの出力をファイルにリダイレクトし、コマンドでそのファイルを使用すると、この小さな問題はさておき、答えが機能します。どうもありがとう! :) – RodrikTheReader

+0

@RodrikTheReader、はい、あなたは正しい、私は今日は少し遅いようです。おそらくgrepを使用せずに中間ファイルを使用しなくても、全体の試練をawkできるかもしれませんが、元のファイル形式を見ることなく、少し難しいです。 (入力をソートすると、awkの部分が簡単になり、awkスクリプトを並べ替えることなく、すべてのPIDを同時に追跡する必要があります)。また、一時ファイルをスキップし、 'awk'を'ソート' – ilkkachu

0

別のAWKで。すべての最初と最後をハッシュし、最後に印刷します。エントリが1つしかない場合は、1つしか出力されません。

$ awk ' 
{ 
    if($5 in f)        # if first exists 
     l[$5]=$0        # update last 
    else f[$5]=$0 }       # else first 
END { 
    for(i in f)        # loop all firsts 
     print f[i] ((i in l)?ORS l[i]:"") } # output firsts and lasts if exist 
' file 
15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 
関連する問題