Linux
如何轉換 Syslog 日期時間在噸C在噸CUTC到大紀元?
我目前正在拼湊一個工具來處理我的網路中生成的 Syslog,其中一個要求是將 DateTime 從它在 syslog (%b %d %Y %T) 中的格式轉換為紀元。本質上,這就是我想要實現的目標:
原始系統日誌格式:
1: Jul 02 2019 15:14:19: %ASA-6-106015: <message> 2: Jul 02 2019 15:14:49: %ASA-6-106015: <message>
最終日誌:
1: 1562080489 %ASA-6-106015 <message> 2: 1562080529 %ASA-6-106015 <message>
我知道我可以通過遍歷整個日誌並執行 date -d 操作來做到這一點。這是我想避免的。我更喜歡使用 GAWK 時間函式。
這是我的方法,
gawk -F: '{ print strftime("%s", timestamp}' syslog.log
但這裡的時間戳必須與 systime() 函式返回的值格式相同。它不是。
此外,我不能使用 mktime() 函式將 syslog 時間戳轉換為所需的格式,因為它僅在輸入為特定格式時才接受
$$ YYYY MM DD HH MM SS $$ 我覺得有一種方法可以做到這一點,但我錯過了。任何替代方法也將受到讚賞。
使用 GNU
date
,您可以執行date
一次並讓它從標準輸入中獲取輸入。使用gawk 的協同處理功能每個都有一個實例awk
並date
處理所有日期:% awk -v cmd='stdbuf -oL date +%s -f-' -F': ' 'BEGIN{OFS=FS} {print $2 |& cmd; cmd |& getline $2} 1' foo 1: 1562048059: %ASA-6-106015: <message> 2: 1562048089: %ASA-6-106015: <message>
請注意,
date
的輸出需要無緩衝(因此是stdbuf -oL
),否則協程序將掛起。
就像
date(1)
實用程序一樣,gawk
’mktime()
假定日期規範使用的是本地時間。要強制它使用
UTC
,TZ
應該使用 envvar:$ TZ=UTC gawk -F'[: ]+' '{sub(/([^:]+:){4} */, mktime(sprintf("%s %02d %s %d %d %d", $3, index(" JanFebMarAprMayJunJulAugSepOctNovDec",$1)/3, $2, $4, $5, $6))"\t"$7"\t"); print}' 1562080459 %ASA-6-106015 <message> 1562080489 %ASA-6-106015 <message>