私は何百もの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
表示されます。l1
l2
egrep "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
どちらのファイルも同じ形式でl1
なければなりません。l2
次のコマンド:
cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'
|
ファイルの内容から区切られたIPアドレスのリストを作成しますl2
。に渡された正規表現の文字です|
。or
egrep
ファイルでテスト:
$ 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
ファイルが長すぎて最大コマンドライン長を超えないことを願っています。 :-(