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.0Fedora 17ます。

4

2 に答える 2

2

ログファイルがWindowsベースの場合、ほぼ確実に、邪悪な^ M文字の副作用(影響?;->)を処理しています。あなたが説明しているように、それは間違いなく問題を引き起こす可能性があります。

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

役立つはずです。

これは実際のCtrl-M文字であり、Ctrl-VとCtrl-Mを押してvi準拠のエディターで生成された2文字の「^」、「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'

MacOSXawk version 20070501でテスト済み。GNU Awk 4.0.0

于 2012-06-06T10:36:16.187 に答える