2つの後続のパターンが一致するときから一致しないまですべての行を一覧表示する方法

2つの後続のパターンが一致するときから一致しないまですべての行を一覧表示する方法

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

関連情報