다른 문자열의 인덱스를 기반으로 하위 문자열을 얻는 방법

다른 문자열의 인덱스를 기반으로 하위 문자열을 얻는 방법

일부 로그 파일에서 정수 값을 추출해야 합니다. 정수 값은 항상 하위 문자열 뒤에 나타납니다 return code. 하지만 이 하위 문자열 뒤에는 다른 내용이 있을 수도 있고 없을 수도 있습니다. 다음은 두 가지 예시 항목입니다.

Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds 
Job with id 0 COMPLETED with return code 255

따라서 첫 번째 경우에는 16이 필요하고 두 번째 경우에는 255가 필요합니다.

나의 초기 접근 방식은 awk를 사용하는 것이었지만 필요한 값이 나타나는 열이 일치하지 않아 실패했습니다.

이를 어떻게 신뢰할 수 있는 방식으로 달성할 수 있습니까?

답변1

매개변수 확장 사용:

#! /bin/bash

strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds'
         'Job with id 0 COMPLETED with return code 255'
        )

for string in "${strings[@]}" ; do
    code=${string#*return code }
    code=${code%%[!0-9]*}
    echo $code
done

#왼쪽과 오른쪽의 %패턴을 삭제하세요 .

답변2

Perl을 사용하는 정규식을 사용하는 솔루션은 다음과 같습니다.

perl -ne 'print "$2\n" if m/(code )(\d*)/' a.txt

이는 숫자의 합계를 표준 출력으로 16인쇄하며 255, 각 숫자는 별도의 줄( \n)에 표시됩니다. 여기에는 a.txt두 줄이 포함되어 있습니다.

Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255

답변3

버전 은 다음과 같습니다 sed.

sed -e 's/.*return code \([0-9]\+\).*/\1/' logfile.txt

바로 다음 번호를 제외하고 해당 줄의 모든 항목을 삭제합니다 return code.

또는 GNU sed의 확장 정규식을 사용하세요.

sed -r -e 's/.*return code ([0-9]+).*/\1/' logfile.txt 

참고: 일부 버전에서는 확장 정규식을 활성화하는 대신 sed사용합니다 .-E-r

또한 이 sed스크립트는 정규식과 일치하지 않는 모든 행을 변경 없이 인쇄합니다. 이것이 원하는 것이 아니라면 seds -n옵션과 p명령을 사용하여 일치하는 줄만 인쇄하십시오. 예:

sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt 

관련 정보