sed 또는 grep을 사용하여 정규식을 기반으로 하위 문자열을 추출합니다.

sed 또는 grep을 사용하여 정규식을 기반으로 하위 문자열을 추출합니다.

(BSD) UNIX 환경에서 정규식을 사용하여 특정 하위 문자열을 캡처하고 싶습니다.

dmesg명령 출력에 다음 줄이 포함되어 있다고 가정합니다 .

pass2: <Marvell Console 1.01> Removable Processor SCSI device

<예를 들어 와 문자 >사이의 텍스트를 캡처하고 싶습니다 .

dmesg | <sed command>

다음을 출력해야 합니다:

Marvell Console 1.01

그러나 정규식이 일치하지 않으면 아무 것도 출력하지 않아야 합니다. 많은 솔루션에는 sed -e 's/$regex/\1/일치하는 항목이 없을 경우 전체 입력을 출력하는 기능이 포함되어 있는데 이는 제가 원하는 것이 아닙니다.

해당 정규식은 다음과 같습니다. regex="^pass2\: \<(.*)\>"

sed정규식 일치를 어떻게 사용하거나 올바르게 사용합니까 grep? grep -P내 BSD UNIX 배포판에서는 이 옵션을 사용할 수 없습니다. 그러나 sed -E옵션을 사용할 수 있습니다.

답변1

이 시도,

sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'

또는 POSIXly( -E2019년 현재 POSIX 규격이 아님):

sed -n 's/^pass2:.*<\(.*\)>.*$/\1/p'

산출:

$ printf '%s\n' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'
Marvell Console 1.01

<...>그러면 각 줄의 마지막 항목 만 인쇄됩니다 .

답변2

-ogrep에서 일치하는 부분만 인쇄하는 것은 어떻습니까? 여전히 삭제해야 <>하지만 tr작동됩니다.

dmesg |egrep -o "<([a-zA-Z\.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01

답변3

sed, awk 및 Python을 사용하여 다음 3가지 방법을 시도했습니다.

sed 명령

echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"

산출

Marvell Console 1.01

awk 명령

echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" '{print $2}'

산출

Marvell Console 1.01

파이썬

#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
    o=i.split(' ')
    for i in o[1:4]:
        h.append(i)
print (" ".join(h)).replace('>','').replace('<','')

산출

Marvell Console 1.01

답변4

다음을 사용하여 하위 문자열을 추출 할 수 있습니다 grep -o -e.

cat some.log | grep "lineWithThisText" | grep -o -e 'SomeSequence1[0-9]*[A-Z]*SomeSequence2'

어떤 이유로 이 grep regex match 명령에서 하나 이상의 일치 항목이 *작동하지 않습니다.+

다음을 사용하여 grep 매뉴얼을 읽으십시오.

man grep

옵션 -o및 에 대해 읽어보세요 -e.

저는 직장에서 여러 로그 라인에서 대량의 데이터를 추출하는 데 이를 사용합니다.

관련 정보