(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( -E
2019년 현재 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
-o
grep에서 일치하는 부분만 인쇄하는 것은 어떻습니까? 여전히 삭제해야 <>
하지만 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
.
저는 직장에서 여러 로그 라인에서 대량의 데이터를 추출하는 데 이를 사용합니다.