n번째 패턴 발생을 검색하고 패턴 뒤에 k 줄을 인쇄하는 방법을 찾고 있습니다. 이 상황 awk
보다는 나을 것 같은데 grep
어떻게 해야 제대로 할 수 있을지 모르겠네요...
다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.
Draft
blablablabla
tralalalalala
Draft
blablablabla
tralalalalala
Draft
important line 1
important line 2
Draft
blablablabla
tralalalalala
이 예에서는 n=3
" k=2
Draft" 패턴이 세 번째로 나타난 후 2줄을 인쇄하고 싶습니다. 내 특별한 경우에는 n과 k가 다를 수 있습니다.
이것이 쉬운 방법입니까?
답변1
답변2
awk: 세 번째와 네 번째 "초안" 줄 사이에 줄을 인쇄합니다.
awk -v n=3 '/Draft/ { p = (++num == n) ; next }; p' file
최적화해야 할 한 가지가 있습니다. 네 번째 초안에 도달하면 종료하는 것입니다.
답변3
grep
다음을 사용하여 tail
이를 달성 할 수 있습니다 .
$ n=3
$ k=2
$ grep -m "$n" -A "$k" 'Draft' input.txt | tail -n "$k"
important line 1
important line 2
$
grep 옵션은 -m "$n"
첫 번째 일치 후 중지를 지정 n
하고 grep에게 각 일치 후에 한 줄을 출력하도록 지시합니다 -A "$k"
. k
그런 다음 파이프를 통해 tail -b "$k"
해당 k
라인만 출력합니다.
답변4
sed -ne'/^\(.*\n\)*Draft *$/G' \
-e's/\n/&/3;t$' -e'N;D;:$' \
-e's///g;//!n;N;G;s/\n//2' \
-etq -e/.$/b$ -e:q -e'p;q' <in >out
important line 1
important line 2