2つのファイルがあります。最初のものはunip.txt
、2番目はですipex.txt
。すべてのファイルにはIPアドレスが含まれています。
unip.txt
:
49.235.113.205
50.115.166.136
51.15.70.104
51.15.87.74
51.15.134.103
146.148.13.9
148.70.23.131
148.72.212.161
148.216.29.46
149.56.141.193
ipex.txt
:
51.15.134.103
148.70.23.131
151.141.0.0
97.89.32.238
デフォルトでは、ファイルを検索してファイルにIPがunip.txt
含まれているかどうかを確認する方法を見つけようとします。ipex.txt
各行を検索するのはループになりそうですが、どうすればいいかわかりません。
答え1
この機能はに内蔵されていますgrep
。この-f
オプションを使用してください。
grep -Fx -f ipex.txt unip.txt
これにより、すべての一致が印刷されます。はい/いいえ答えにのみ興味がある場合は、オプション-q
(「静か」)を使用してください。
if grep -Fxq -x -f ipex.txt unip.txt; then
echo unip.txt contains IP addresses from ipex.txt
else
echo "unip.txt doesn't contain IP addresses from ipex.txt"
fi
なぜ-F
?デフォルトでは、grepは行をipex.txt
正規表現として解釈し、この行のドットは「すべての文字」を意味します。これは間違った一致を引き起こす可能性があります。-F
正規表現ではなく定数文字列と一致することを確認してください。
なぜ-x
?これにより、IPアドレスがの行全体と一致することを確認して、アドレス一致などのunip.txt
部分一致を防ぎます。49.235.113.20
49.235.113.205
答え2
この問題を解決するもう1つの方法は、コマンドを使用することですcomm
。両方のファイルを比較し、(1)見つかった行を識別するのに役立ちます。ただファイル1、(2)で行が見つかりました。ただfile2と(3)の行両方文書。唯一の欠点は、両方の入力ファイルを並べ替える必要があり、正確な行と一致することです(つまり、行内の部分文字列を見つけることができません)。
unip.txt
あなたの例をsumとして保存し、を使用してソートしてipex.txt
実行sort
しましたcomm unip.txt ipex.txt
。出力:
146.148.13.9
148.216.29.46
148.70.23.131
148.72.212.161
149.56.141.193
151.141.0.0
49.235.113.205
50.115.166.136
51.15.134.103
51.15.70.104
51.15.87.74
97.89.32.238
出力には、上記のように、ポイント(1)、(2)、(3)に対応する3つのタブで区切られた列があります。次のように列の出力を抑制できますcomm -1 unip.txt ipex.txt
。このコマンドはいいえ最初の列を印刷します。
したがって、要約すると、質問に答えるために入力ファイルをソートしてから実行する必要があります。comm -12 unip.txt ipex.txt
これにより、出力の最初の2列が表示されず、2つのファイルの行が印刷されます。
148.70.23.131
51.15.134.103
役に立ったことを願っています!