
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番目のフィールドを配列の長さである
m
arrayに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