2

次のようなエントリを含むTomcatアクセスログがあります。

50.47.142.25 - - [07/May/2012:00:00:14 +0000] 0 "GET /mywebpage/blah.jsp " 200 123 "-" "-"

すべてのエントリをSQLテーブルに入れてから、SQLクエリを実行したいと思います。

GAWK(gnu AWK)を使用してすべての行をCSV形式で取得することを考えています。何かのようなもの:

gawk '{print $1 ", " $2 ", " , " $3 ", " $4 ", " $5 ", " $6 ", " $7 ", " $8 ", " $9 ", " $9}'

私にくれます

50.47.142.25, -, -, [11/May/2012:08:51:02, 0, "GET /mywebpage/blah.jsp" 200, 123, -, -

これにより、SQLの挿入ステートメントに近づくことができます。ただし、日時は次の形式である必要があります。

2012-05-11 08:51:02

つまり、先頭の角かっこはなく、SQLServerが必要とする形式です。ヒントはありますか?

4

1 に答える 1

3
#!/usr/bin/awk -f
BEGIN {
    monthlist = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
    c = split(monthlist, monthsarr)
    for (i = 1; i <= c; i++) {
        months[monthsarr[i]] = i
    }
    fieldlist = "1 2 3 5 8 10 11 14 15 17 20"
    fieldcount = split(fieldlist, fields)
    OFS = ","
}

{
    delim = ""
    c = split($0, logarr, /[ \[\]"]/)
    split(logarr[5], datearr, /[/:]/)
    ts = mktime(datearr[3] " " months[datearr[2]] " " datearr[1] " " datearr[4] " " datearr[5] " " datearr[6])
    logarr[5] = strftime("%F %T", ts)
    for (f = 1; f <= fieldcount; f++) {
        printf "%s%s", delim, logarr[fields[f]]
        delim = OFS
    }
    printf "\n"
}

サンプル ログ エントリに基づくと、出力は次のようになります。

50.47.142.25,-,-,2012-05-07 00:00:14,0,GET,/mywebpage/blah.jsp,200,123,-,-

引用符と角括弧は、スペースとともにフィールド スプリッターとして使用されるため、破棄されます。また、これにより多くの false フィールドが作成されるため、フィールド リストを使用して反復処理を行います。

mktime()およびstrftime()関数は GNU AWK に固有のものであることに注意してください( gawk)。

于 2012-05-15T13:53:32.593 に答える