一部の環境(リスト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
機能します。パターンに一致するすべての部分を「フィールド」、host
IPv4アドレス(デフォルトのフォーム検証のみを実行)、それぞれ単一のスペースで区切られた単一の連続した文字列として扱います。 - 最初のフィールドには「ソース」部分が含まれています。空間から配列に分割され、
a
3番目の配列項目(「環境」部分)はローカル変数に格納されます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
ファイルとlistA
2番目のファイルとして使用されます。
> 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