grep -Ef 捕获两个文件中匹配的 ip 地址,并打印或回显每次迭代的结果,找到 xx.xx.xx.xx 或未找到 xx.xx.xx.xx

grep -Ef 捕获两个文件中匹配的 ip 地址,并打印或回显每次迭代的结果,找到 xx.xx.xx.xx 或未找到 xx.xx.xx.xx

中有一个包含数百个 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。是传递给 的正则表达式的|字符。oregrep

用文件测试:

$ 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

我只希望你的文件不要太长而超出最大命令行长度:-(

相关内容