ログの追跡中にログのタイムゾーンを変換する方法

ログの追跡中にログのタイムゾーンを変換する方法

ログを追跡しながら、ログの日付スタンプ形式をリアルタイムで操作したいと思います。現在の形式はです2016-04-06T23:19:20.878Z。現地のタイムゾーンに変換してミリ秒を削除したいです。出力の残りの部分は、変更されずにリアルタイムで実行できるように出力をまたはtail -f同じものにパイプできますか?awksed

ベストアンサー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)

おすすめ記事