2つの順序付き文字列リストを持つファイルの行の一致

2つの順序付き文字列リストを持つファイルの行の一致

一部の環境(リストA)がターゲットであり、他の環境(リストB)がソースであるファイルのアクセスリスト行を一致させようとしています。その逆。

これはUbuntuサーバーにあります。

問題は、これらのリストの長さがそれぞれ約15行なので、かなりの組み合わせと非常に長いgrepコマンドが発生することです。検索中のファイルは合計約3000行です。

ファイルの行をファイルの行と一致させることでこれを行うことができますが、特定のgrep -f検索要件を満たす解決策が見つかりません。両方のリストで検索しているので、順序が重要です。

私がやろうとしているタスクの例(各IPアドレス行に関連する環境が追加されたファイルから取得するため、角かっこは意図的です):

リストAコンテンツ:

(One)
Two
Three

表Bの内容:

(Four)
(Five)
(Six)

検索中のファイル:

access-list acl-name line 1 extended permit tcp host 1.2.3.4 (One) host 5.6.7.8 Two eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (One) host 5.6.7.8 (Four) eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Four) host 5.6.7.8 Three eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Six) host 5.6.7.8 (One) eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Five) host 5.6.7.8 (Five) eq ssh

希望の出力(Aをターゲットとしてリスト):

access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Six) host 5.6.7.8 (One) eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Four) host 5.6.7.8 Three eq ssh

目的の出力(Bをターゲットとしてリスト):

access-list acl-name line 1 extended permit tcp host 1.2.3.4 (One) host 5.6.7.8 (Four) eq ssh

私はUbuntuで利用可能なすべてのコマンドまたはPythonスクリプトで開いています。

現在、私のgrep検索は次のとおりです(リストBがターゲットでリストAがソースである一致行の場合)。

grep -iE '\(One\).*\(Four\)|Two.*\(Four\)|Three.*\(Four\)|\(One\).*\(Five\) and so on... '

助けてくれてありがとう。現在のスクリプトの文字数を15000文字から減らすことを願っています。 :)

ベストアンサー1

内部変数にGNU Awkを使用できると仮定すると、次のFPATプログラムが機能するはずです。

awk 'BEGIN{FPAT="host ([[:digit:]]+.){3}[[:digit:]]+ [^ ]+"}
     t=="src"{src[$0];next}
     t=="dst"{dest[$0];next}
     {split($1,a,/ /);lsrc=a[3]; split($2,a,/ /);ldst=a[3]}
     (lsrc in src && ldst in dest)' t="src" listA t="dst" listB t="" access

プログラムが呼び出され、3つのファイルを処理します。各処理実行では、変数は処理されたファイルを識別できるように異なる値に設定されawkます。t

  • tに設定されている場合、srcプログラムはこれが「ソース」リストであると仮定し、行の内容を関連配列として読み込みますsrc(ただし、実際には項目に値を割り当てずに配列インデックスのみを埋めます)。その後、処理はすぐにファイルの次の行に移動します。先行または末尾のスペースはありません。それ以外の場合は、パターンマッチングに含まれます。また、以降の一致では、行に内部スペースを持たずに1つの連続した文字列しか含まれていないと仮定します。
  • tに設定されている場合、dstプログラムはこれが「ターゲット」リストであると仮定し、同様にすべての行の内容を配列に登録しますdest

他の値がある場合、tプログラムはその値が「デフォルト」アクセスリストにあると見なし、実際の一致を実行します。

  • ここでは、FPATこのセクションで設定した内部変数がBEGIN機能します。パターンに一致するすべての部分を「フィールド」、hostIPv4アドレス(デフォルトのフォーム検証のみを実行)、それぞれ単一のスペースで区切られた単一の連続した文字列として扱います。
  • 最初のフィールドには「ソース」部分が含まれています。空間から配列に分割され、a3番目の配列項目(「環境」部分)はローカル変数に格納されますlsrc
  • 2番目のフィールドも同様に処理され、「環境」部分はローカル変数に保存されますldst
  • ルールブロックの外側には、行を印刷するかどうかを決定するブール条件があります。lsrc配列のインデックス内に含まれている場合は、次の行を印刷します。src そしてこのldst配列のインデックスに含まれていますdest

listA最初のファイルと2番目のファイルとして使用された結果listBは次のとおりです。

> awk ' ... ' t="src" listA t="dst" listB t="" access
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (One) host 5.6.7.8 (Four) eq ssh

逆の場合、最初のlistBファイルとlistA2番目のファイルとして使用されます。

> awk ' ... ' t="src" listB t="dst" listA t="" access
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Four) host 5.6.7.8 Three eq ssh
access-list acl-name line 1 extended permit tcp host 1.2.3.4 (Six) host 5.6.7.8 (One) eq ssh

おすすめ記事