特定の所有者:グループと権限を使用してファイルをインストールするためのファイルがあります。わかりやすくするために、権限とインストールファイルの詳細は無視します。所有者とグループを特定のペアに設定した後、区切り線を印刷し、所有者またはグループが変更されるまですべての後続行を印刷したいと思います。行番号と行番号を印刷できればいいと思います。私が検索するペアは、所有者、グループ所有者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に変更します。
2番目のモードを0540(グループ実行不可)から0550に変更します。
答え1
たとえば、次の2つのフラグを使用できます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