【发布时间】:2016-12-27 07:11:12
【问题描述】:
我有一个循环设置来输入一个包含 IP 列表的文件。循环将使用 IP 搜索文件以获取关联的 MAC 地址。有时,每个 IP 都会列出多个 MAC。它可以是一个,也可以是七个或更多。这真是一个未知数。我所知道的是,我需要能够比较每个 IP 报告了多少 MAC,并在它们不完全匹配时回显某些内容。这是我的脚本输出现在的样子:
Testing 192.168.17.25
00:0f:XX:41:e7:50; 00:0f:XX:41:e7:50; 00:0f:XX:41:e7:50;
Testing 192.168.17.26
00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0; 00:0f:XX:43:7a:f0;
这是我的while循环:
cat $list | while read line;
do
echo "Testing $line"
var=$(/bin/grep -A 10 -w $line $file | /bin/grep 'ethernet' | /bin/awk '{print $3}')
echo $var
done
如何构造一个 if/then 进入循环以比较 MAC 地址并在找到不同的 MAC 地址时回显一条消息?
更新:$list 文件是一个带有 IP 的简单文本文件。
192.168.17.1
192.168.17.2
等等……
我通过运行 IP 来获取 MAC 的 $file 是 DHCP 租用文件。
lease 192.168.17.28 {
starts 2 2016/07/12 07:36:15;
ends 3 2016/07/13 07:36:15;
tstp 3 2016/07/13 07:36:15;
tsfp 3 2016/07/13 19:36:15;
atsfp 3 2016/07/13 19:36:15;
cltt 2 2016/07/12 07:36:15;
binding state free;
hardware ethernet 84:7b:eb:24:87:ef;
uid "\001\204{\353$\207\357";
更新:@pakistanprogrammerclub
当我运行脚本时,我得到:
[root@localhost]# ./genipmacs.sh < leasesfile > ipmaclist
awk: cmd. line:2: {ipmac[$1][$2]=1}
awk: cmd. line:2: ^ syntax error
awk: cmd. line:6: for(mac in ipmac[ip])
awk: cmd. line:6: ^ syntax error
不确定它在这里想要什么。其他东西需要用引号括起来吗?
更新 #2 @pakistanprogrammerclub
使用修改后的 awk 代码后,脚本按预期运行,没有错误。但是,我的 ipmaclist 文件如下所示:
192.168.17.25 1 00:0
00:0 4164 192.168.17.26
192.168.17.27 1 192.168.17.28
00:0 4164 192.168.17.29 192.168.17.30
由于某种原因,它没有获得 MAC。我想我只需要调整代码中的 grep 和 sed 命令。这似乎是根本原因。在脚本之外运行这些会产生您在上面看到的数据,然后 awk 会尝试解析它。 Grep 和 sed 外部脚本:
x.x.x.x x.x.x.x. 00:0
x.x.x.x. 00:0
x.x.x.x. 48:
x.x.x.x x.x.x.x 48:
x.x.x.x. 00:0
似乎只是切断了 mac 的写入线。
更新 #3
新的 ipmaclist 内容:
00:0f:94:43:fd:d0 2 x.x.x.x
x.x.x.x. 1 dc:37:14:82:a2:82
x.x.x.x. 1 00:0f:94:41:d4:d0
x.x.x.x 1 00:0f:94:41:9f:e0
租赁文件 -
x.x.x.x
x.x.x.x
x.x.x.x
x.x.x.x
更新 4
新代码也可以工作,但以相反的方式工作。
00:0f:94:c1:31:20 1 192.168.17.26
00:0f:94:c1:1f:30 3 192.168.17.27 192.168.17.28 192.168.17.29
00:0f:94:66:84:f0 1 192.168.17.30
【问题讨论】:
-
您能否发布一个原始文件格式的示例?
-
是的,给我一些。刚刚更新。
-
为什么不将
var设为索引数组 并在/bin/awk '{print $3}'之后添加| sort -u,例如var=( $(your stuff | sort -u) )然后${#var[@]}告诉你有多少个独特的mac,echo "${var[@]}"列出它们或者你可以做for i in ${var[@]}; do echo "$i"; done。 -
这就是我最终做的事情。我保持一切不变,除了我将 sort -u 添加到我的 var 变量的末尾。现在我知道如果我看到多个 MAC,我有一个重复的 IP。 .
-
您在问题中显示的错误来自
awk,告诉您它不知道[...][...]的含义。awk中的多维数组与[..., ...]一起使用。另外,您没有向我们展示那部分代码。
标签: bash if-statement while-loop