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