1

次のログステートメントを含むログファイルがあります

例えば

Before starting transaction id = <unique number>
After starting transaction id = <unique number>

....

Before starting transaction id = <unique number>
After starting transaction id = <unique number>

「Before」に対して単純なgrepを実行すると、400個のステートメントが表示されますが、「After」に対して単純なgrepを実行すると、402個のステートメントが表示されます。

ペアで発生しないこれらのステートメントを見つける方法。

4

3 に答える 3

2

前と後のペアが同じである必要がある場合unique number

awk -F= '{a[$2]++;}END{for(i in a)if(a[i]!=2)print "id:"i}' file

それらの対になっていないIDを出力します。

例えば:

kent$  cat file
Before starting transaction id = 1
After starting transaction id = 1
Before starting transaction id = 2
After starting transaction id = 2
Before starting transaction id = 3
Before starting transaction id = 4
After starting transaction id = 4
After starting transaction id = 5

kent$  awk -F= '{a[$2]++;}END{for(i in a)if(a[i]!=2)print "id:"i}' file
id: 3
id: 5
于 2013-02-15T09:42:53.787 に答える
2

BeforeとIDを抽出してからAfter、次のように差分します。

$ diff -wb <(grep Before file | cut -d= -f2 | sort) <(grep After file | cut -d= -f2 | sort)

シェルがプロセス置換をサポートしていない場合、つまり<(...)、一時ファイルを使用します。

$ grep Before file | cut -d= -f2 | sort > before
$ grep After file | cut -d= -f2 | sort > after
$ diff -wb before after
于 2013-02-15T09:34:32.507 に答える
1

grep複数の行を読み取ることができないため、この仕事にはあまり適していません。-B1と組み合わせて読み取ることもできますが、などのより強力なツールを使用して解析するsed必要awkがあります。

これは、ラインの前にエクストラニューが発生した場合にも機能する別のアプローチです(ドライランechoできるようにするためにそこにあります)。

$ echo 'Before starting transaction id = 123
After starting transaction id = 123
After starting transaction id = 54675
Before starting transaction id = 567
After starting transaction id = 567' | 
  sort -k6 | uniq -u -f5 # end cmd
After starting transaction id = 54675

一意のIDのみをチェックすることで機能します。そこにどのようなコンテンツが入っているのかわからないので、既存のエントリと重複している可能性があります。その場合は、別の方法で行う必要があります。これがより安全なアプローチです。これは、両方のケースをキャッチし、ID頻度が2より多いまたは少ないオカレンスを返します。

$ echo 'Before starting transaction id = 123
After starting transaction id = 123
After starting transaction id = 567
Before starting transaction id = 567
After starting transaction id = 567' | 
  sort -k6 | uniq -c -f5 | grep -v "^[[:space:]]*2[[:space:]]"
3 After starting transaction id = 567
于 2013-02-15T09:45:55.397 に答える