로그의 분 및 초 혼합 기간 값(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대상 문자열(예: )이 포함됩니다 38.924266437s.
  • 문자열의 두 번째 필드를 배열의 길이인 marray 로 a분할 합니다.n
  • 새 값 계산: 그렇다면 n1번째 배열 값(초)을 사용하고, 그렇지 않으면 두 배열 값을 기준으로 초를 계산합니다.
  • 두 번째 필드를 부동 소수점 형식의 계산된 값으로 바꿉니다.
  • 기록을 인쇄합니다.

답변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

관련 정보