
ログを追跡しながら、ログの日付スタンプ形式をリアルタイムで操作したいと思います。現在の形式はです2016-04-06T23:19:20.878Z
。現地のタイムゾーンに変換してミリ秒を削除したいです。出力の残りの部分は、変更されずにリアルタイムで実行できるように出力をまたはtail -f
同じものにパイプできますか?awk
sed
答え1
タイムスタンプがどのフィールドにあるかを知っている場合(たとえば、2番目の単語)、awkを使用して次のように呼び出して変換できますdate
。
stdbuf -oL tail -f ... |
awk -v timefield=2 '{
if($timefield ~ /[0-9].*Z/){
"date --date \"" $timefield "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
上記のように、パイプのバッファではなくテールが必要になることがありますstdbuf -oL
。フィールドがわからない場合や移動した場合は、各単語のタイムゾーンパターンを一致させることができます。
awk '{
for(timefield = 1;timefield<=NF;timefield++)
if($timefield ~ /^[0-9].*T.*Z$/){
"date --date \"" $timefield "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
これは、タイムスタンプがスペースで区切られていると仮定します。
アノテーションの例では、awkを使用してタイムスタンプの長さとオフセットが一定であるため、I2016-04-08T00:34:29.372Z]v3087
タイムスタンプを抽出できます。結果の出力で初期コードと末尾コードを維持したくない場合は、次のように終了します。substr(string,offset,length)
datestamp = substr($timefield, 2, 24)
I
awk -v timefield=1 '{
if($timefield ~ /[0-9].*Z/){
datestamp = substr($timefield, 2, 24)
"date --date \"" datestamp "\"" | getline tod
sub($timefield,tod,$0)
}
print
}'
追加のコードを保持するには、sub
フィールド全体ではなく日付スタンプ文字列を置き換えるように変更してください。たとえば、余分なスペースを使用してくださいsub(datestamp," " tod " ",$0)
。