일부 로그 파일에서 정수 값을 추출해야 합니다. 정수 값은 항상 하위 문자열 뒤에 나타납니다 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
스크립트는 정규식과 일치하지 않는 모든 행을 변경 없이 인쇄합니다. 이것이 원하는 것이 아니라면 sed
s -n
옵션과 p
명령을 사용하여 일치하는 줄만 인쇄하십시오. 예:
sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt