ログの分と秒の混合期間の値(logfmt形式を使用)を一貫した単位に変換するには?

ログの分と秒の混合期間の値(logfmt形式を使用)を一貫した単位に変換するには?

logfmtには、次の行を含むログファイルがあります。

duration=38.924266437s job=267842 project=507
duration=38.924266437s job=267842 project=507
duration=2m56.408984141s job=267850 project=745
duration=2m56.408984141s job=267850 project=745
duration=3m38.211342699s job=267846 project=173
duration=3m38.211342699s job=267846 project=173
duration=3m38.690043053s job=267843 project=173
duration=3m38.690043053s job=267843 project=173
...

期間値を測定単位(秒または分)にどのように変換しますか?

答え1

使用awk:

awk -F'[= ]' '{ 
  n=split($2, a, "m")
  sub($2, sprintf("%.9f", (n==1 ? a[1] : 60*a[1]+a[2])))
}1' file

出力:

duration=38.924266437 job=267842 project=507
duration=38.924266437 job=267842 project=507
duration=176.408984141 job=267850 project=745
duration=176.408984141 job=267850 project=745
duration=218.211342699 job=267846 project=173
duration=218.211342699 job=267846 project=173
duration=218.690043053 job=267843 project=173
duration=218.690043053 job=267843 project=173
  • =フィールド区切り記号を使用すると、2番目のフィールドには$2ターゲット文字列(たとえば)が含まれます38.924266437s
  • 文字列の2番目のフィールドを配列の長さであるmarrayにa分割します。n
  • 新しい値の計算:そうであればn最初1の配列値(秒)を使用し、そうでない場合は2つの配列値に基づいて秒を計算します。
  • 2番目のフィールドを浮動小数点形式の計算値に置き換えます。
  • 履歴を印刷します。

答え2

これはどうですか?

#!/bin/bash

regex_min='duration=([0-9]+)m'
regex_sec='([0-9]+)\.([0-9]+)s'

while read -r line; do
	[[ $line =~ $regex_sec ]]
	sec=${BASH_REMATCH[1]}
	frac=${BASH_REMATCH[2]}
	if [[ $line =~ $regex_min ]]; then
		sec=$(( sec + 60*${BASH_REMATCH[1]} ))
	fi

	echo $line: $sec.$frac
done

オンラインでお試しください!

別の名前で保存しprocess.shて実行してください。 cat myfile | bash process.sh

サンプルデータで得られた出力は次のとおりです。

duration=38.924266437s job=267842 project=507: 38.924266437
duration=38.924266437s job=267842 project=507: 38.924266437
duration=2m56.408984141s job=267850 project=745: 176.408984141
duration=2m56.408984141s job=267850 project=745: 176.408984141
duration=3m38.211342699s job=267846 project=173: 218.211342699
duration=3m38.211342699s job=267846 project=173: 218.211342699
duration=3m38.690043053s job=267843 project=173: 218.690043053

関連情報