搜索一个文件以查看它是否包含另一文件的信息

搜索一个文件以查看它是否包含另一文件的信息

我有两个文件。第一个是unip.txt,第二个是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

我试图弄清楚如何基本上搜索该unip.txt文件以查看它是否包含该ipex.txt文件中的任何 IP。我想这将是一个循环来搜索每一行,但我不知道该怎么做。

答案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 将 in 中的行解释ipex.txt为正则表达式,并且这些行中的点具有“任何字符”的含义。这可能(并且可能会)导致错误匹配。-F确保匹配常量字符串,而不是正则表达式。

为什么-x?它确保 IP 地址与 中的整行匹配unip.txt,从而防止部分匹配,例如防止49.235.113.20匹配地址49.235.113.205

答案2

我喜欢解决此类问题的另一种方法是命令comm。比较两个文件并确定 (1) 找到的行很有用仅有的在 file1, (2) 中找到的行仅有的在 file2 中,以及 (3) 中找到的行两个都文件。唯一的缺点是两个输入文件都需要排序,并且它匹配精确的行(即,不查找行内的子字符串)。

我将您的示例保存为unip.txtipex.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)。您可以像这样抑制列的输出:comm -1 unip.txt ipex.txt。该命令将不是打印第一列。

因此,总的来说,要回答您的问题,您需要对输入文件进行排序,然后运行comm -12 unip.txt ipex.txt​​,这将抑制输出的前两列,然后打印在两个文件中找到的行:

148.70.23.131
51.15.134.103

希望这可以帮助!

相关内容