grep 같은 일치 다른 인쇄

grep 같은 일치 다른 인쇄

이전에 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
  • -PPerl 호환 정규식을 활성화하고 일치하는 출력에 \K이전 내용을 포함하지 않습니다.\K
  • -o해당 라인의 일치하는 부분만 출력
  • -m1Transferred:두 번째 줄을 제외하려면 첫 번째 일치하는 줄 다음에 종료하세요.

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 

관련 정보