2

大きなログファイルがあります。複数の正規表現を1つずつ適用する必要があり、各正規表現の出力を印刷する前に、テキストを印刷する必要があります。

たとえば。

正規表現を適用した後、次のような出力が得られるはずです。

Text 1

Output of first regex
....


Text 2 

Output of second regex
....

Text 3

Output of third regex
....

ここで、テキスト1、テキスト2、およびテキスト3は挿入されたテキストです。AWKを使用してこれを達成できますか?

編集:

サンプルログファイルの一部を追加しています。

[1351059075] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351059898] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351073883] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL 
[1351073886] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL
[1351088949] SERVICE ALERT: server3:PSU ;CRITICAL;HARD;3;Connection refused

EmailここでHistory、すべてを分離したいPSUので、出力は次のようになります。

Email:

[1351059075] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351059898] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused

History:

[1351073883] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL 
[1351073886] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL

PSU:

[1351088949] SERVICE ALERT: server3:PSU ;CRITICAL;HARD;3;Connection refused 

私は簡単なawkスクリプトを書きました:

awk 'BEGIN {print "Email:\n\n"} /SERVICE ALERT: .*Email.*CRITICAL;HARD/ {print $0}' logfilename

希望する方法で印刷するために、同じawkスクリプトに複数の正規表現を含める方法がわかりません。

4

2 に答える 2

3

あなたが求めていることは些細なことです (/RE/{action} 行を追加するだけです) が、RE を使用するアプローチはそもそも間違っています。あなたがする必要があるのはこれだけです:

$ cat file
[1351059075] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351059898] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351073883] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL
[1351073886] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL
[1351088949] SERVICE ALERT: server3:PSU ;CRITICAL;HARD;3;Connection refused

$ cat tst.awk
BEGIN{ FS = "[:;]" }
{ out[$3] = out[$3] $0 ORS }
END { for (type in out) print type ORS out[type] }

$ awk -f tst.awk file
Email
[1351059075] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351059898] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused

PSU
[1351088949] SERVICE ALERT: server3:PSU ;CRITICAL;HARD;3;Connection refused

History
[1351073883] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL
[1351073886] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL
于 2012-10-24T15:47:38.397 に答える
1

次のコマンドを試してください(さまざまな行に分割されたワンライナーです)。

awk '
    BEGIN { 
        FS = "[:;]"; 
    } 
    {
        if ( $3 in keys ) {
            printf "%s\n", $0;
        }
        else {
            printf "%s%s:\n\n%s\n", (length( keys ) > 0) ? "\n" : "", $3, $0;
        }

        keys[ $3 ] = 1;
    }
' infile

その結果、次のようになります。

Email:

[1351059075] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused
[1351059898] SERVICE ALERT: server1:Email;CRITICAL;HARD;3;Connection refused

History :

[1351073883] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL 
[1351073886] SERVICE ALERT: server2:History ;CRITICAL;HARD;3;HTTP CRITICAL

PSU :

[1351088949] SERVICE ALERT: server3:PSU ;CRITICAL;HARD;3;Connection refused
于 2012-10-24T15:47:41.237 に答える