Linux

如何轉換 Syslog 日期時間在噸C在噸CUTC到大紀元?

  • July 4, 2019

我目前正在拼湊一個工具來處理我的網路中生成的 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 的協同處理功能每個都有一個實例awkdate處理所有日期:

% 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)實用程序一樣,gawkmktime()假定日期規範使用的是本地時間。

要強制它使用UTCTZ應該使用 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>

引用自:https://unix.stackexchange.com/questions/528316