명령 출력에서 ​​문자열을 검색하고 추출하는 방법은 무엇입니까?

명령 출력에서 ​​문자열을 검색하고 추출하는 방법은 무엇입니까?

운영 체제:커널 2.6.x

유용:비지박스 1.2x에서

명령은 여러 줄의 텍스트를 출력합니다.

string1 text1: "asdfs asdf adfas"
string2 text2: "iojksdfa kdfj adsfj;"
string3 text3: "skidslk sadfj"
string4 text4: "lkpird sdfd"
string5 text5: "alskjfdsd safsd"

표적:"text4:"(따옴표 제외)가 포함된 줄을 검색한 다음 해당 문자열 뒤의 모든 문자를 줄 끝까지 추출해야 합니다.

원하는 출력:"lkpird sdfd"(따옴표 포함)

현재 나는 ...

command | grep 'text4:' | awk -F': ' '{print $3}'

이것을 작성하는 더 쉬운 방법이 있습니까?

답변1

sed 사용

$ command | sed -n 's/.*text4://p'
 "lkpird sdfd"

-n명시적으로 요청하지 않는 한 인쇄하지 말라고 sed에 지시합니다. s/.*text4:// sed에게 줄의 처음부터 끝까지 모든 텍스트 항목을 삭제하도록 지시합니다 text4:. 그러한 행이 발견되면 psed는 이를 인쇄하라는 지시를 받습니다.

사용grep -P

$ command | grep -oP '(?<=text4:).*' 
 "lkpird sdfd"

-o일치하는 부분만 인쇄하도록 grep에 지시합니다. 다음 을 제외한 (?<=text4:).*모든 텍스트와 일치합니다 .text4:text4:

-P옵션에는 GNU grep이 필요합니다. 따라서 busybox의 내장 명령이나 grepBSD/Mac OSX 시스템의 기본 명령에서는 작동하지 않습니다.grep

awk를 사용하세요

원래 grep-awk 솔루션은 다음과 같이 단순화될 수 있습니다.

$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"

awk 사용(대체)

$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
 "lkpird sdfd"

/text4:/포함된 행을 선택합니다 text4:. sub(/.*text4:/, "")행의 시작 부분부터 마지막 ​​항목까지 모든 텍스트를 삭제하도록 awk에 지시합니다 text4:. printawk에게 이 줄을 인쇄하라고 지시하세요.

답변2

PCRE 지원 grep\K알림.

command |grep -Po 'text4: \K.*'

관련 정보