다음 두 줄의 패턴을 grep하고 한 줄의 패턴을 삭제합니다.

다음 두 줄의 패턴을 grep하고 한 줄의 패턴을 삭제합니다.

다음과 같은 파일이 있습니다.

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}' 

구분된 블록은 공백이므로 완벽하게 작동합니다.

관련 정보