在awk中连接字符串

时间:2012-06-06 10:10:25

标签: awk

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

它包含以下条目:

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

2 个答案:

答案 0 :(得分: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 20070501GNU Awk 4.0.0进行了测试。

答案 1 :(得分:2)

如果基于Windows的日志文件,那么你几乎肯定会处理邪恶^ M char的副作用(影响?; - &gt;)。它可以在您描述时彻底产生问题。

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

应该有帮助。

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

我希望这会有所帮助。