두 개의 grep을 하나로 병합

두 개의 grep을 하나로 병합

다른 명령의 출력에서 ​​ID를 추출해야 합니다. 현재 내 추출 명령은 다음과 같습니다.

someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')

명령 출력의 예:

 ---> Using cache
 ---> 9b4624927fa6
Successfully built 9b4624927fa6

예상되는 결과:

9b4624927fa6

행에서 추출된 ID

Successfully built 9b4624927fa6

이 두 개의 grep 문을 하나로 결합하려면 어떻게 해야 합니까?

답변1

내 첫 번째 창작물을 약간 수정했습니다 grep.

$ grep -oP '^Successfully\sbuilt\s\K[\da-z]{12}$' example-output
9b4624927fa6

\KPCRE에서게임을 재설정하여 시작하세요:

이스케이프 시퀀스로 \K인해 이전에 일치한 문자가 최종 일치 시퀀스에 포함되지 않습니다.

너비가 0인 긍정적인 뒤돌아보기 어설션과 유사합니다 (?<=Successfully....

답변2

로 시작하는 줄 끝의 16진수를 얻으려면 Successfully built다음을 사용할 수 있습니다 sed.

sed -n -E 's/^Successfully built ([[:xdigit:]]+)$/\1/p'

그러면 일치하는 줄이 해시로 바뀌고 인쇄됩니다(다른 줄은 제외).

또는 awk:

awk '/^Successfully built [[:xdigit:]]+$/ { print $NF }'

그러면 정규식과 일치하는 각 줄의 마지막 공백으로 구분된 필드가 인쇄됩니다.

두 정규식 모두에서 [[:xdigit:]]+해당 표현식은 비어 있지 않은 16진수 문자열과 일치합니다.

관련 정보