![문자열을 검색하고 두 패턴 사이의 모든 줄을 꺼내고 싶습니다. [중복]](https://linux55.com/image/6471/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EA%B3%A0%20%EB%91%90%20%ED%8C%A8%ED%84%B4%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EC%A4%84%EC%9D%84%20%EA%BA%BC%EB%82%B4%EA%B3%A0%20%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%5B%EC%A4%91%EB%B3%B5%5D.png)
문자열을 검색하여 두 패턴(패턴 포함) 사이의 모든 줄을 추출하고 싶습니다.
#1 시작 이름 S 101 프랑크푸르트_1_1 19호 A+ 거리 끝 #2 시작 이름 B 104 베를린 20 A+ 거리 끝 시작 #100 이름C 107 베를린 이십 일 A+ 거리 끝 #24 시작 명명 된 110 프랑크푸르트_1_1 이십 일 A+ 끝
grep
내가 프랑크푸르트 라면
그런 다음 START와 END(START와 END 포함) 사이의 모든 줄을 표시해야 합니다. 예를 들면 다음과 같습니다.
#1 시작 이름 S 101 프랑크푸르트_1_1 19호 A+ 거리 끝 #24 시작 명명 된 110 프랑크푸르트_1_1 이십 일 A+ 거리 끝
내가 사용한 명령은 다음과 같습니다.
고양이 파일 | awk '/START/,/END/' | grep -p 프랑크푸르트
그러나 그것은 작동하지 않았습니다.
답변1
검색이 여러 줄을 기반으로 하기 때문에 awk가 해당 작업에 적합한 도구인지 확실하지 않습니다. 나는 이것이 Perl의 일이라고 생각합니다. 사용할 수 있는 파일을 찾아보려면(awk 문과 유사):
if (/^START/ .. /^END/){}
거기에서 행을 배열에 저장하고 프랑크푸르트가 충족되면 행을 인쇄합니다(여기서는 부울 사용).
push @lines, $_;
if (/Frankfurt/)
$toPrint = 1;
모든 경우에 패턴 밖으로 나갈 때 부울이 true이면 배열을 인쇄하고, 그렇지 않으면 인쇄하지 말고 배열을 지웁니다.
답변2
우리는 확실히 사용할 수 있습니다 awk
. 이것을 시도해 보세요
awk -v RS="END" '$0~/프랑크푸르트/{print $0 RS}' 파일