다음 내용이 포함된 파일이 있습니다.
zdk
aaa
b12
cdn
dke
kdn
입력 1: aaa
및cdn
출력 1:
aaa
b12
cdn
입력 2: zdk
및dke
출력 2:
zdk
aaa
b12
cdn
dke
다음 명령을 사용하여 이를 달성할 수 있습니다.
grep -a aaa -A2 file # Output 1
grep -a aaa -A4 file # Output 2
하지만 파일에서 끝 문자열 패턴이 발생하는 위치(위치)를 정확히 알 수 없습니다(파일에는 20000줄이 있습니다).
이 목표를 어떻게 달성할 수 있나요?
답변1
grep
여기서는 당신을 도울 수 없습니다. sed
범위 표현식을 사용하면 이 작업을 더 잘 수행할 수 있습니다.
$ sed -n '/aaa/,/cdn/p' file
aaa
b12
cdn
$ sed -n '/zdk/,/dke/p' file
zdk
aaa
b12
cdn
dke
sed -n
명시적으로 요청한 경우에만 행이 인쇄되도록 자동 인쇄를 억제합니다. /aaa/,/cdn/
이는 범위가 발생할 때 발생합니다.
이러한 범위 표현식은 에서도 사용할 수 있습니다 awk
. 다음과 같이 말할 수 있습니다.
awk '/zdk/,/dke/' file
sed -n '/^aaa$/,/^cdn$/p' file
물론 이러한 모든 조건은 한 줄이 완전히 포함되어 있는지 확인 aaa
하고 cdn
다른 것은 포함되지 않는지 확인 하는 등 보다 제한적인 정규식으로 확장될 수 있습니다 .
답변2
이는 다음을 통해 수행할 수 있습니다.sed
sed -n '
/^aaa$/,/^cdn$/w output1
/^zdk$/,/^dke$/w output2
' file
답변3
이것은 grep
명령입니다:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'
여러 줄 일치를 달성할 수 있지만 ( -OS X와 같은 모든 플랫폼에서는 지원되지 않음) grep
perl-regexp를 사용해야 합니다 . 따라서 해결 방법으로 새 줄을 문자로 바꾼 다음 다시 변경합니다.grep
-P
_
grep
아니면 당신은 사용할 수 있습니다pcregrep
다중 라인 모드( -M
)를 지원합니다.
또는 다음을 사용하십시오 ex
.
ex +"/aaa/,/cdn/p" -scq! file