私は現在ネットワーク上で生成されたsyslogを処理するためのツールをまとめていますが、要件の1つは日付時刻を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]
これを行う方法があるようですが、欠落しています。代替方法もありがとうございます。
ベストアンサー1
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
)そうでなければ、コプロセスは中断されます。