2

我有一个很大的日志文件。我必须一个一个地应用多个正则表达式,在打印每个正则表达式的输出之前,我需要打印一些文本。

例如。

应用正则表达式后,我应该得到如下输出:

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,分开HistoryPSU所以我的输出应该是这样的:

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

尝试以下命令(在 varios 行中进行单行拆分):

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 回答