3

我有一个日志文件,我需要在服务器上“重播”。

它包含这样的条目:

Request:
        query: EXEC prc_insert_customer
        @param0: 110040851
        @param1: 137463
        @param2: user@example.com
        @param3: John
        @param4: Smith
        @param5: Some address
        @param6:
        @param7:
        @param8: Some city
        @param9: GBR
        @param10: POSTCODE
        @param11: (555) 123-45-67
Response:

...

我需要将每个块像这样转换成

EXEC prc_insert_customer '110040851', '137463',  ..., '(555) 123-45-67'

我尝试为此使用 awk:

/EXEC prc_insert_customer/ {
        str = "EXEC prc_insert_customer";
}

str && /@param/ {
        if ($1 == "@param0:")
                sep = ""
        else
                sep = ","
        str = ((str) (sep) " '"($2) ("'"))
}

/^Response/ {
        if (str)
                print str
        str = ""
}

但我得到的输出是:

', '(555)'DE', '', 'Some', 'GBR0851

如何获得正确的输出?

GNU Awk 4.0.0使用Fedora 17.

4

2 回答 2

2

如果日志文件基于 Windows,那么您几乎可以肯定是在处理邪恶的 ^M 字符的副作用(影响?;->)。正如您所描述的,它肯定会产生问题。

 sub(/^M/,"", $0)

应该有帮助。

那是一个真正的 Ctrl-M 字符,而不是 2 个字符'^','M',在符合 vi 的编辑器中通过按 Ctrl-V 和 tne Ctrl-M 生成。

我希望这有帮助。

于 2012-06-06T11:33:58.603 回答
2

此代码片段的轻微变化将起到作用:

BEGIN { processing = 0 }
/^Request/ { processing = 1 }
/^Response/ { processing = 0 }

{
    if (! processing)
        next

    if ($1 ~ /^@param/)
    {
        sep = ($1 == "@param0:" ? "" : ", ")
        rest = "'"
        for (i = 2; i <= NF; ++i)
            rest = rest (i == 2 ? "" : " ") $i
        rest = rest "'"

        str = str sep rest
    }
    else if (str != "")
    {
        print "EXEC prc_insert_customer", str
        str = ""
    }
}

这为我打印:

 EXEC prc_insert_customer '110040851', '137463', 'user@example.com', 'John', 'Smith', 'Some address', '', '', 'Some city', 'GBR', 'POSTCODE', '(555) 123-45-67'

在 Mac OSX 上进行了awk version 20070501测试。GNU Awk 4.0.0

于 2012-06-06T10:36:16.187 回答