grep -Efは両方のファイルから一致するIPアドレスをキャプチャし、各反復の結果(xx.xx.xx.xx検索またはxx.xx.xx.xxが見つかりません)を印刷またはエコーします。

grep -Efは両方のファイルから一致するIPアドレスをキャプチャし、各反復の結果(xx.xx.xx.xx検索またはxx.xx.xx.xxが見つかりません)を印刷またはエコーします。

私は何百ものIPアドレスからなる短いリストを持っておりfile1、これらのIPアドレスのうち、デフォルトのリストから欠落しているアドレスがあるかどうかを確認したいと思いますfile2。出力>両方のケースの結果を印刷するファイルにリダイレクトを見つけます。たとえば、次のようになります。

xx.xx.xx.xx missing
xx.xx.xx.xx found

6つの同様の質問を見直して多くのことを学びましたが、既存の質問のどれも私の質問に完全に答えていないので、自分で作成しました。

awk両方を使用していくつかのアプローチを試しましたが、grep -F -f比較結果を調整し、論理的な説明を書くのに問題があります。

6つの既存の回答を検討して多くのことを学びましたが、それらのどれも私が理解する方法で正確に私の目標を解決できませんでした。

答え1

whileループを使用してください:

while IFS= read -r i; do
  grep -Fq "$i" file && echo "$i found" || echo "$i missing"
done <ip_addresses

  • whileファイルの各行を繰り返します。ip_addresses
    • grep -Fq-F任意の文字と一致しない一致を含む行を固定文字列()で検索します。この-qフラグはgrep何も印刷しないようにします。
    • && echo "$i found"成功すると、grep住所が見つかりました。
    • || echo "$i missing"そうでなければ欠けています。

答え2

fileがl1不明なIPアドレスを含むリストであり、fileがデフォルトのl2リストであるとします。

l1以下は、次にのみ存在し、次にはないすべてのIPアドレスのリストですl2

egrep -v "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1

オプションを削除すると、に表示されるすべてのIPアドレスが一覧-v表示されます。l1l2

egrep "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1

どちらのファイルも同じ形式でl1なければなりません。l2

次のコマンド:

cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'

|ファイルの内容から区切られたIPアドレスのリストを作成しますl2。に渡された正規表現の文字です|oregrep

ファイルでテスト:

$ cat l1
192.168.0.10
192.168.2.14
192.168.0.11
192.168.0.9

$ cat l2
10.64.10.200
192.168.4.0
192.168.2.3
192.168.0.10
192.168.0.11
192.168.1.0
192.168.2.0

紛失したIPアドレスを探す:

$ egrep -v "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
192.168.2.14
192.168.0.9

重複したIPアドレスを探す:

$ egrep  "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
192.168.0.10
192.168.0.11

ファイルが長すぎて最大コマンドライン長を超えないことを願っています。 :-(

関連情報