ファイルを検索して他のファイルの情報が含まれているかどうかを確認する

ファイルを検索して他のファイルの情報が含まれているかどうかを確認する

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.2049.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

役に立ったことを願っています!

関連情報