
다음과 같은 파일이 있습니다.
dn: 다난
cn: 다니안
cn: danian1
dn: danian2
cn: danian2
dn: danian3
cn: danian3
cn: danian4
내가 원하는 것은 "dn:" 패턴을 grep하고 다음 2줄만 인쇄하는 것뿐입니다. 하지만 grep -A 2 "dn:"을 실행하면 결과는 파일의 모든 것이므로 다음 2줄만 인쇄하고 싶습니다. 다음 1줄 아님
답변1
이것은 효과가 있을 수 있습니다:
$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt
dn:
레코드 구분자로 정의합니다 . 한 레코드의 필드는 새 줄 문자로 구분됩니다 \n
.
로 시작하는 줄 뒤에 두 줄이 있는 경우 dn:
새 레코드가 로 시작되기 전에 dn:
레코드의 4개 필드로 이어지는 "\n"이 3번 표시됩니다. 이것이 레코드( )에 3개 이상의 필드가 있는지 확인하는 이유입니다 NF>3
. 이 경우 전체 레코드를 인쇄하지만 앞에 dn:
.
NF>3
한 레코드에서 다음 줄이 두 개 이상인 모든 레코드를 찾습니다 . 정확히 2개만 포함하려면 로 변경하세요 NF==3
.
블록이 빈 줄로 구분된 경우(이후 주석 중 하나에서 나타나는 것처럼) 대신 다음을 사용하십시오.
$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt
답변2
위의 명령을 실행하면 완벽하게 작동합니다.
awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}'
구분된 블록은 공백이므로 완벽하게 작동합니다.