2016-03-19 4 views
0

ログファイルから取得した日付形式をawkを使用して次のように変更したいとします。誰かが私にこれを助けることができますか?awkログファイルから日付形式を変更する

INPUT:

Feb 29 03:32:02 localhost.localdomain haproxy[12722]: xxx.xxx.xxx.xxx:46141 [29/Feb/2016:03:32:02.460] loadbalancer 0/0/0/23/23 304 197 - - --VN 29/2/0/0/0 0/0 {Mozilla/5.0 (Linux; Android 5.0.1; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36} "GET xxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1" 
Feb 29 03:32:02 localhost.localdomain haproxy[12722]: xxx.xxx.xxx.xxx:46141 [29/Feb/2016:03:32:02.460] loadbalancer 0/0/0/23/23 304 197 - - --VN 29/2/0/0/0 0/0 {Mozilla/5.0 (Linux; Android 5.0.1; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36} "GET xxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1" 

予想される出力:

2016-02-29 03:32:02 localhost.localdomain haproxy[12722]: xxx.xxx.xxx.xxx:46141 [29/Feb/2016:03:32:02.460] loadbalancer 0/0/0/23/23 304 197 - - --VN 29/2/0/0/0 0/0 {Mozilla/5.0 (Linux; Android 5.0.1; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36} "GET xxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1" 
2016-02-29 03:32:02 localhost.localdomain haproxy[12722]: xxx.xxx.xxx.xxx:46141 [29/Feb/2016:03:32:02.460] loadbalancer 0/0/0/23/23 304 197 - - --VN 29/2/0/0/0 0/0 {Mozilla/5.0 (Linux; Android 5.0.1; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36} "GET xxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1" 

=========================== ==================================== コマンドを使用(間違った構文):

# awk ' 
{ 
logdate=$1" "$2" "$3; 
changedate="date -d "'"logdate"'" +\"%Y-%m-%d %T\""; 
changedate | getline var; 
gsub (logdate,var); 
print var;`enter code here` 
}' test.log 

エラー出力:

date: extra operand ‘03:32:02’ 
Try 'date --help' for more information. 

date: extra operand ‘03:32:02’ 
Try 'date --help' for more information. 
+1

質問をフォーマットするためのおかげでエドモートン... – skumble

答えて

1

あなたはのawkを使用する必要は、簡単なシェルループは動作しますしない場合は:

while read mon day rest; do 
    printf "%s %s\n" "$(date -d "$mon $day" +%F)" "$rest" 
done < file.log 

あなたがawkのを使用する必要がある場合、それは各ラインの日付を呼び出すことは本当に必要はありません。

awk ' 
    BEGIN { 
     split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", m) 
     for (i=1; i <= 12; i++) mon[m[i]] = i 
    } 
    { 
     $1 = sprintf("2016-%02d", mon[$1]) 
     sub(/ /,"-") 
     print 
    } 
' file.log 
+0

おかげでスクリプト用のグレン... – skumble

関連する問題