我有两个文件。第一个是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.txt
和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)。您可以像这样抑制列的输出:comm -1 unip.txt ipex.txt
。该命令将不是打印第一列。
因此,总的来说,要回答您的问题,您需要对输入文件进行排序,然后运行comm -12 unip.txt ipex.txt
,这将抑制输出的前两列,然后打印在两个文件中找到的行:
148.70.23.131
51.15.134.103
希望这可以帮助!