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
.- 문자열의 두 번째 필드를 배열의 길이인
m
array 로a
분할 합니다.n
- 새 값 계산: 그렇다면
n
첫1
번째 배열 값(초)을 사용하고, 그렇지 않으면 두 배열 값을 기준으로 초를 계산합니다. - 두 번째 필드를 부동 소수점 형식의 계산된 값으로 바꿉니다.
- 기록을 인쇄합니다.
답변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