ファイルに他のファイルの内容の正規表現が含まれている場合は、その行を削除してください。

ファイルに他のファイルの内容の正規表現が含まれている場合は、その行を削除してください。

DNSレコードを含む大容量ファイル(150,000行以上)がありますが、FileAと呼びます。いくつかの名前を含む小さなファイルFileBがあります。 FileAのすべての行を削除したいです。次に終わるFileBには何がありますか?しかし、私はそうですいいえ名前がレコードの先頭に表示されたら、行を削除しようとします。

grep -v name$レコードの最後に表示される名前を手動で削除する方法を知っていますが、FileB全体を通過するにはループが必要です。これまでの試みは失敗しました。

以下は、私が求めていることを示すことを望む例です。

FileA:
hosta IN A 10.20.30.40
hostb IN A 20.30.40.50
myurl IN CNAME hostb
yours IN CNAME hostb

FileB にホストが含まれている場合、最後の 2 行だけが削除され、最初の 2 行はそのまま残ります。

答え1

この-fフラグを使用して、FileBのすべての行をgrepできます。

grep -v -f FileB FileA

それはあなたが望むものです。ただし、これによりパターンのあるFileB行も削除されます。いいえ最後にのみ一致する必要があることを明示的に指定します。したがって、それに対応する修正が必要ですFileB。 、を使用して行末記号をsed追加できます。regex$

sed 's/$/$/' FileB

これは何も置き換えないように見えますが、実際には行の$各端に1つずつ追加されます。

これで、プロセス置換を使用してこれらすべてを1つにまとめることができます。

grep -v -f <(sed 's/$/$/' FileB) FileA

答え2

FileB全体を繰り返すには、次のようにします。

for i in `cat FileB`
do
<do your work>
done

しかし、CNAMEでフィルタリングする方が良いかもしれません。

答え3

次のことができますsed

sed -n '/^[^ ]*$/{H;d;};G;/ \(.*\)\n.*\n\1/d;P' fileB fileA

これは最初のプロセスfileBです。この行にスペースがない場合は、fileBのホスト名でなければならず、予約済みスペースに追加して続行します({H;d;})。

他のすべての行はfileAから取得する必要があります。Gホスト名リストの重複行の最後の単語を含むすべての行は、ホスト名リスト()の後に予約されたスペースを追加することで削除できます。末尾のリスト(P)なしで残りの行を印刷します。オプションは-nデフォルト出力を無効にします。

編集する: 実際、人がすべきことは

sed -n '/^[^ ]*$/{H;d;};G;/ \(.*\)\n.*\n\1\n/d;/ \(.*\)\n.*\n\1$/d;P' fileB fileA

特別な状況を避けるために。

関連情報