이전에 grep과 관련하여 귀중한 도움을 얻었으므로 이것도 알아낼 수 있기를 바랍니다.
이것은 Rclone 로그에서 가져온 것입니다.
Transferred: 577.080M / 577.080 MBytes, 100%, 12.660 MBytes/s, ETA 0s
Errors: 0
Checks: 2 / 2, 100%
Transferred: 2 / 2, 100%
Elapsed time: 45.5s
내가 하고 싶은 일은 사용자 정의 텍스트로 이메일 알림을 만드는 것입니다. "577MB 전송, 오류가 없는 파일 2개를 45.5초 @ 12,660MB/s로 전송"과 같은 것입니다.
따라서 이를 작동시키려면 이 값을 인쇄해야 합니다. 이전 방법을 따라해 보았지만 성공하지 못했습니다. 로그에서 두 번 전송하고 이를 분할하여 TRF= 577.080Mbytes 및 TRS= 12.660 MBytes/s를 얻는 방법
TRF=$(grep -o 'Transferred:.*' $logfile| cut -d\ -f4)
ERR=$(grep -o 'Errors:.*' $logfile | cut -d\ -f4)
TIM=$(grep -o 'Elapsed time:.*' $logfile | cut -d\ -f3-)
TRS=$(grep -o 'Transferred:.*' $logfile | cut -d\ -f4)
답변1
전달 인자:
$ grep -Pom1 'Transferred:.*/ \K[^,]*' "$logfile"
577.080 MBytes
-P
Perl 호환 정규식을 활성화하고 일치하는 출력에\K
이전 내용을 포함하지 않습니다.\K
-o
해당 라인의 일치하는 부분만 출력-m1
Transferred:
두 번째 줄을 제외하려면 첫 번째 일치하는 줄 다음에 종료하세요.
TRS:
$ grep -Po 'Transferred:[^,]*,[^,]*, \K[^,]*' "$logfile"
12.660 MBytes/s
- TRF와 유사: 두 번째 쉼표 뒤의 모든 항목 + 쉼표가 아닌 공백을 가져옵니다.
-m1
패턴에 여러 개의 쉼표가 포함되어 있으므로 이것이 필요하지 않습니다.
잘:
$ grep -Po 'Errors:[[:space:]]*\K.*' "$logfile"
0
- 줄 끝의 숫자만 가져오고 공백 문자를 제거합니다.
팀:
$ grep -Po 'Elapsed time:[[:space:]]*\K.*' "$logfile"
45.5s
전송된 파일 수: (이것은 두 숫자 중 첫 번째입니다)
$ grep -Po 'Transferred:[[:space:]]*\K[0-9]+(?= /)' "$logfile"
2
(?= /)
는 긍정적인 예측(PCRE)이므로 공간을 찾고 있습니다/
. 이 부분은\K
일치하는 출력에 포함되지 않는 것과 같으며 첫 번째Transferred
줄이 일치하지 않아야 합니다.
답변2
이 방법은 단일 프로세스만 사용하여 전체 출력 라인을 생성합니다. 따라서 일련의 grep 및 cut을 사용하는 것보다 훨씬 빠릅니다. 또한 awk는 매우 강력하므로(예를 들어 부동 소수점 계산을 수행할 수 있음) 나중에 출력을 향상시킬 때 유용할 수 있습니다.
노력하다:
$ awk '/ETA/{mb=$2; speed=$7" "$8} /Errors/{err=$2} /Transferred/{n=$2} /Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}' rclone.log
Transferred 577.080M, 2 files with 0 errors in 45.5s @ 12.660 MBytes/s,
어떻게 작동하나요?
/ETA/{mb=$2; speed=$7" "$8}
현재 행에 ETA가 포함된 경우(즉, 첫 번째
Transferred
행) 두 번째 필드를 에 저장mb
하고 일곱 번째 및 여덟 번째 필드를 에 저장합니다speed
./Errors/{err=$2}
행에 가 포함된 경우
Errors
두 번째 필드를 에 저장합니다err
./Transferred/{n=$2}
행에 가 포함되어 있으면
Transferred
두 번째 필드를 변수에 저장하십시오n
./Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}'
마지막으로 포함된 줄에 도달하면
Elapsed
메시지를 인쇄합니다.
여러 줄 버전
코드를 여러 줄에 걸쳐 분산시키려는 경우:
awk '
/ETA/{
mb=$2
speed=$7" "$8
}
/Errors/{
err=$2
}
/Transferred/{
n=$2
}
/Elapsed/{
printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed
}' rclone.log