다음과 같은 파일이 있습니다.
line1
line2
line3
line4
line5
line6
line7
line5
line2
line1
와 사이의 데이터를 가져오고 싶습니다 line5
. 나는 그것을 사용했다 awk '/line1/,/line5/' myfile
. 예상되는 출력은 다음과 같습니다.
line1
line2
line3
line4
line5
그러나 awk는 마지막 경기까지 읽습니다 line5
. 나는 awk가 마지막 경기가 아닌 첫 번째 경기에서 멈추기를 원합니다.
답변1
문제를 재현할 수 없습니다. awk *는 내가 예상한 대로 수행합니다. 첫 번째 발생 사이에서 line1
첫 번째 발생까지 모든 줄을 인쇄합니다 line5
.
$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5
line5
파일의 다섯 번째 줄에 있는 문자열에 인쇄되지 않는 숨겨진 문자가 있습니까? 이것이 awk
일치하지 않는 이유를 설명합니다 .
해당 명령을 실행하여 다시 확인할 수 있습니다 sed
.
$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5
모든 행을 인쇄하지 않음(기본 동작)을 나타내지만 의 첫 번째 발생부터 첫 번째 발생까지의 -n
모든 행을 인쇄하도록 지시합니다.sed
/line1/,/line5/p
line1
line5
그냥 인쇄하고 싶다면첫 번째패턴과 일치하는 줄로 시작 line1
하고 일치하는 줄로 끝나는 줄 집합을 만들려면 line5
다음을 사용할 수 있습니다.
sed -n '/line1/,$p;/line5/q' file
*gawk
GNU 구현을 사용하여 확인했습니다 (Kusalananda는 이것이 awk
OpenBSD에서도 awk
올바른 mawk
일을 한다는 것을 확인했습니다).
답변2
다음을 사용할 수 있습니다 awk
.
awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile
line1
다음 첫 번째 줄이 일치할 때까지 일치하는 줄을 인쇄한 다음 line5
즉시 종료합니다.
답변3
awk '/foo/,/bar/'
인쇄모두foo
일치하는 줄로 시작하고 다음 일치하는 줄(또는 동등한 줄의 반대쪽과 동일한 줄)로 sed
끝나는 파일 부분 bar
입니다(정규식은 line1
include를 포함하는 줄과도 일치합니다).line1anything
line10
어울리고 싶다면첫 번째line1
일치하는 줄로 시작 하고 다음 일치하는 줄(또는 같은 줄)로 끝나는 섹션의 경우 다음을 line5
수행할 수 있습니다.
sed '/line1/,$!d;/line5/q' < file
line5
(첫 번째 일치하는 줄 뒤에 일치하는 줄이 없으면 해당 줄부터 파일 끝까지 line1
인쇄됩니다 . 또한 패턴은 다음과 같습니다.line1
sed
기초적인정규 표현식이지만 awk
이는 확장 표현식입니다).