두 줄에 대한 grep 패턴을 작성하고 그 중 하나를 삭제합니다.

두 줄에 대한 grep 패턴을 작성하고 그 중 하나를 삭제합니다.

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

DN: 다나안

cn: 새해

cn: 새해 1


도메인 이름: danian2

cn: 새해 2


도메인 이름: danian3

cn: 새해 3

cn: 새해 4

내가 원하는 것은 "dn:" 패턴에 대해 grep을 수행하고 다음 두 줄만 인쇄하는 것입니다. 그러나 grep -A 2 "dn:"을 실행하면 결과는 파일의 모든 것이므로 다음 두 줄만 인쇄하고 싶습니다. 행 행이 1개 아래 행이 아닙니다.

답변1

이것은 효과가 있을 수 있습니다:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

우리는 이를 dn:레코드 구분자로 정의합니다. 레코드의 필드는 줄 바꿈으로 구분됩니다 \n.

로 시작하는 줄 뒤에 두 줄이 있는 경우 dn:새 레코드가 로 시작하기 전에 3개의 "\n"이 생기 dn:므로 레코드에 4개의 필드가 생깁니다. 그래서 레코드( NF>3)에 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}' 

구분된 블록은 비어 있으며 정상적으로 작동합니다.

관련 정보