다음 정보가 포함된 파일이 있다고 가정해 보겠습니다.
...
Entry '234238': some text
some text
some text
some text
Entry '899823': some text
some text
some text
Entry '234238': more text
more text
more text
Entry '645353': some text
some text
some text
특정 을 추출하고 싶습니다 Entry '<code>'
. 예를 들어 grep_my_block 'Entry '234238'
다음과 같이 반환되어야 합니다.
Entry '234238': some text
some text
some text
some text
Entry '234238': more text
more text
more text
알아채다:
- 식별자 블록은
<code>
파일에 여러 번 나타날 수 있습니다. 우리는 그러한 블록을 모두 추출하고 싶습니다. - 블록은 알 수 없는 수의 라인으로 구성될 수 있습니다.
어떻게 사용하거나 grep
이를 awk
수행할 수 있습니까 ack
?
답변1
awk "/^Entry '234238'/ {printline = 1; print; next}
/^Entry / {printline = 0}
printline"
답변2
ENTRY="'234238'"
sed -n ':s;/Entry '"$ENTRY"'/{:l;p;n;/^Entry/bs;bl;}' <<\ENTRY
Entry '234238': some text
some text
some text
some text
Entry '899823': some text
some text
some text
Entry '234238': more text
more text
more text
Entry '645353': some text
some text
some text
#END
ENTRY
산출
Entry '234238': some text
some text
some text
some text
Entry '234238': more text
more text
more text
이것은 것보다 낫습니다awk
(제 생각에는)왜냐하면sed's
스트림 작업.
그것은 내가 해본 일 중 가장 덜 복잡한 일 중 하나입니다. 일단 마음먹고 나면 말이죠. 이것은 GNU 확장 정규식 없이 성공적으로 완료한 첫 번째 작업입니다. 이는 이식성이 매우 뛰어납니다.
이 분기는 두 번 발생합니다. 앵커 포인트가 있습니다.:s
시작점과 기준점에서:l
첨자입니다. 그것은 작동하기 때문에n
연산자는 이전 행을 삭제합니다sed's
패턴 공간새로운 것을 가져올 때.
한 번sed
당신의 찾기"$ENTRY"
그것은 설정한다지점 :l
아벨,라인을 인쇄하고 새 라인을 가져옵니다. 그 다음에sed
새 줄이 문구로 시작하는지 확인'Entry'
이 경우 다시 분기됩니다.:s
산태그를 지정하고 해당 입력을 다시 스캔하기 시작합니다."$ENTRY,"
그렇지 않으면 다음으로 분기됩니다.:l
아벨그리고 반복하다p
린트, n
내선/check/
작업.
명령은 다음과 같이 요약됩니다.
until end of file do
if current line contains "Entry $ENTRY" do
until next line contains 'Entry' do
print line
delete line
next line
done
done
done
답변3
다음을 사용할 수도 있습니다 pcregrep
.
pcregrep -M '234238.*(\n((?!Entry).)*)*' inputfile
그러면 단어가 포함된 줄에서 시작하여 234238
단어가 포함된 줄을 만날 때까지 모든 줄이 생성됩니다 Entry
.
예제 입력의 경우 다음이 생성됩니다.
Entry '234238': some text
some text
some text
some text
Entry '234238': more text
more text
more text
답변4
awk
질문이 행 중심이므로 사용하기에 좋은 도구일 수 있습니다.
중복되는 코드가 적은 @HaukeLaging 솔루션의 변형을 사용하겠습니다. 로 시작하는 모든 줄은 Entry
플래그를 지우지만, 원하는 특정 항목의 헤더에는 해당 플래그가 설정됩니다. 이 플래그가 설정되면 행을 인쇄하는 기본 조치가 수행됩니다.
awk "/^Entry / { printline=0; }
/^Entry '234238'/ { printline=1; }
printline"