中有一个包含数百个 IP 地址的简短列表file1
,并且想要确定主列表中是否缺少任何这些 IP 地址file2
。寻找输出>重定向到打印两种情况结果的文件,例如:
xx.xx.xx.xx missing
xx.xx.xx.xx found
已经审查了六个类似的问题并学到了很多东西,但现有的问题都不能完全回答我的问题,所以我创建了自己的问题。
我尝试了几种方法,既使用awk
,也使用grep -F -f
,但在协调比较结果和构建逻辑语句时遇到困难。
已经审查了六个现有答案并学到了很多东西,但没有一个完全按照我理解的方式解决了我的目标。
答案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
假设 filel1
是包含未知 IP 地址的列表,filel2
是主列表。
下面将列出仅在l1
和 不在 中的所有 IP 地址l2
:
egrep -v "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
如果删除选项-v
,它将列出l1
和中出现的所有 IP 地址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
我只希望你的文件不要太长而超出最大命令行长度:-(