범위를 사용하여 3개의 필터를 전달합니다.

범위를 사용하여 3개의 필터를 전달합니다.

파일이 있어요sample.txt

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:RAM      SAM 
    XY       DUPL
    KEY:UU
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

키워드를 기준으로 주문을 필터링 ord:chandru하고 key:ZZ이러한 항목이 발견되면 하이픈부터 하이픈까지 순서를 제거하여 다음과 같은 출력을 제공합니다.

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

답변1

GNU가 있다면 awk다음을 추천합니다:

gawk 'BEGIN{RS="-+\n"} $0=="" || /ord:chandru/ && /KEY:ZZ/ {ORS=RT; print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

빈 레코드를 강제로 $0==""인쇄합니다(레코드가 하이픈 문자열로 구분되어 있다고 생각하는 경우 파일의 첫 번째 줄이 해석되는 방식입니다).


만약 너라면아니요gawk, 그렇다면 유일한 차이점은 레코드 구분 기호를 쉽게 캡처할 수 없다는 것입니다. 이는 고정 문자열이므로 제공한 예에서는 큰 문제가 아닙니다. 예를 들어 mawk:

mawk 'BEGIN{RS="-------------\n"; ORS=RS} $0=="" || /ord:chandru/ && /KEY:ZZ/ {print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

답변2

이게 좀 더 신뢰성이 있어야 하는데

$ sed -n '1p; /ord:chandru/ {             
N                                           
N
/KEY:ZZ/{
N
/ord:chandru.*\n.*\n.*KEY:ZZ.*\n---.*/p
}
}' file

설명하다

  • -n우리가 요청할 때까지 인쇄하지 마십시오
  • 1p첫 번째 줄을 인쇄합니다. 여기서 하이픈이 연결된 줄이 제공될 것이라고 가정합니다(그 후에는 하이픈이 있는 후행 줄만 인쇄합니다).
  • /ord:chandru/패턴 찾기
  • N\n해당 문자를 사용하여 개행을 나타낼 수 있도록 다음 줄을 읽으십시오.
  • p일치하는 줄 인쇄

답변3

사용:

$ awk 'BEGIN{RS="-------------"};/KEY:ZZ/&&/ord:chandru/{print RS$0}' sample.txt|egrep -v "^ *$"

산출:

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:Z    
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ

답변4

sed -e '
   /^ord:/,/^--*$/!b
   H; /^ord:/h
   /^--*$/!d; g
   /^ord:chandru[ ]/!d
   /\n[ ]*KEY:ZZ\n--*$/!d
'  sample.txt

빠른 요약: /../,/../=>는 from 귀하의 경우와 같이 행 범위를 선택하는 데 사용되는 범위 연산자입니다 /ord:/ to /----/.

우리 다람쥐는 이 범위(한 번에 한 범위)를 보유 영역으로 흔듭니다. 그런 다음 범위의 끝에 도달하면 /---/`a) /ord:chandru/ && b) /key:ZZ/' 기준에 따라 해당 특정 범위를 선택하거나 거부할 때임을 알 수 있습니다.

관련 정보