두 개의 후속 패턴이 일치할 때부터 일치하지 않을 때까지 모든 행을 나열하는 방법

두 개의 후속 패턴이 일치할 때부터 일치하지 않을 때까지 모든 행을 나열하는 방법

특정 소유자:그룹 및 권한을 사용하여 파일을 설치하기 위한 파일이 있습니다. 명확성을 위해 권한 및 설치 파일 세부 정보는 무시하겠습니다. 소유자와 그룹을 특정 쌍으로 설정한 후 구분된 줄을 인쇄하고 소유자나 그룹이 변경될 때까지 모든 후속 줄을 인쇄하고 싶습니다. 줄 번호와 줄 번호를 인쇄할 수 있으면 좋을 것 같습니다. 내가 검색하는 쌍은 소유자, 그룹 소유자X, 그룹Y입니다.

예(줄 번호는 필요하지 않으므로 생략하겠습니다)

type = d  
owner = root  
group = staff  
    mode = 0750 <-Ignore.  owner & group aren't ownerX & groupY  
    ...  <- Ignore  
group = groupY <- owner=root, not ownerX, so still not ownerX & groupY  
    ...  <- Ignore  
owner = ownerX <-Now, owner=ownerX and group=groupY  
    <- Print -----------------  
    mode = 0750             <- Print  
    target = /app_dir/conf  <- Print   
    target = /app_dir/data  <- Print  
owner = dilbert          <- Stop printing since not ownerX & groupY  
    ...  <- Ignore  
group = Dogbert  
    ...  <- Ignore  
group = groupY  
    ...  <- Ignore  
owner = ownerX  
    <- Print a separator line  
    type = f                                                       <- Print  
    mode = 0540                                                    <- Print  
    source = [path to compiled binary file in source environment]/file1_ver2  <- Print  
    target = [path to a bin directory in the install environment]/file  <- Print  
owner = oracle <- stop printing  
...  
<End of File, EOF>  

따라서 원하는 출력은 다음과 같습니다.

---------  
mode = 0750  
target = /app_dir/conf  
target = /app_dir/data  
---------  
type = f  
mode = 0540  
source = [path to compiled binary file in source environment]/file1_ver2  
target = [path to a bin directory in the install environment]/file1  

이렇게 하면 다음 수정 사항을 적용하는 데 도움이 됩니다.
첫 번째 모드를 0750(그룹은 읽기 전용)에서 0770으로 변경합니다.
두 번째 모드를 0540(그룹 실행 불가능)에서 0550으로 변경합니다.

답변1

예를 들어 다음과 같은 두 가지 플래그를 사용할 수 있습니다 awk.

awk '/group =/{a=0};/group = groupY/{$0="----------";a=1}
/owner =/{b=0};/owner = ownerX/{$0="----------";b=1};a*b' infile

따라서 둘 다 1/true인 경우에만 인쇄됩니다. 일치하는 줄과 해당 줄 번호만 인쇄하려면 mode다른 조건을 추가할 수 있습니다.

awk '/group =/{a=0};/group = groupY/{$0="------------";a=1};/owner =/{b=0}
/owner = ownerX/{$0="------------";b=1};(($1=="mode") && (a*b==1)){print NR, $0}' infile

답변2

돈 크리스티님, 감사합니다! 이로 인해 나는 매우 가까워졌습니다. 파일이 다음으로 시작하는 경우:

group = groupY
owner = ownerX

그러나 소유자가 먼저 오면 이를 놓치게 됩니다. 소유자 = OwnerX 그룹 = groupY

귀하의 솔루션을 사용하고 온라인 awk 튜토리얼을 찾아서 두 경우를 모두 포착하도록 수정했습니다. 원래 이렇게 하라는 요청을 받은 것은 아니지만 모드 설정에만 관심이 있습니다. 그래서 특정 범위 내의 모든 라인을 인쇄하는 대신 패턴이 포함된 라인만 인쇄합니다. 문제가 해결되었습니다.

awk '/group =/{t=0}
/group = groupY/{t=1}
/owner =/{p=0}
{if ((t==1) && (p==1) && (seperator_printed==0)) {
  print "-------------------------"
  seperator_printed=1
  }
}
{if ((t==1) && (p==1)) {
    if ($0 ~ /mode/) {print NR, $0}
  } else {
    separator_printed=0
  }
}' infile 

관련 정보