linux - 使用 bash 解析日志以获取唯一的 MAC 地址

标签 linux bash

我已经将 Debian box 设置为几个 cisco ASA 的系统日志服务器。他们正在运行 DHCP,我正在尝试跟踪分配了租约的 MAC 地址的唯一实例。我已将 ASA 设置为仅记录 cisco DHCPd 使用的消息,并将其作为 %HOSTIPADDRESS%.log 发送到 Debian 服务器,然后每天轮换。所以我有一个目录,里面装满了这个:

-rw-r----- 1 syslog adm     536351 Aug 23 06:24 10.10.10.4.log.10
-rw-r----- 1 syslog adm     459634 Aug 22 06:24 10.10.10.4.log.11
-rw-r----- 1 syslog adm     176957 Aug 21 06:24 10.10.10.4.log.12
-rw-r----- 1 syslog adm     246654 Aug 20 06:24 10.10.10.4.log.13
-rw-r----- 1 syslog adm     459978 Aug 19 06:24 10.10.10.4.log.14
-rw-r----- 1 syslog adm     606987 Aug 18 06:21 10.10.10.4.log.15
-rw-r----- 1 syslog adm     599140 Aug 17 06:24 10.10.10.4.log.16
-rw-r----- 1 syslog adm     605837 Aug 16 06:24 10.10.10.4.log.17
-rw-r----- 1 syslog adm     607630 Aug 15 06:24 10.10.10.4.log.18
-rw-r----- 1 syslog adm     189493 Aug 14 06:24 10.10.10.4.log.19

在这些日志中的每一个中,我都有一些看起来像这样的东西:

Aug 23 06:20:19 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 011c.9148.dbb4.15 (172.16.1.196)
Aug 23 06:20:41 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 0138.0f4a.986a.16 (172.16.1.126)
Aug 23 06:20:51 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 0190.b686.63c6.a9 (172.16.1.193)
Aug 23 06:20:55 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 0154.4e90.8a7a.00 (172.16.1.211)
Aug 23 06:21:11 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 012c.0e3d.fcf6.34 (172.16.1.189)
Aug 23 06:21:35 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 0154.4e90.8a7a.00 (172.16.1.211)
Aug 23 06:21:51 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 0154.4e90.8a7a.00 (172.16.1.211)
Aug 23 06:22:29 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 5caf.0664.cd18 (172.16.1.212)
Aug 23 06:24:00 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 01fc.dbb3.49af.eb (172.16.1.207)
Aug 23 06:24:21 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 01a0.3be3.03b4.74 (172.16.1.195)
Aug 23 06:24:39 10.10.10.4 %ASA-6-604103: DHCP daemon interface inside:  address granted 01b4.79a7.1895.33 (172.16.1.157)

问题是 dhcp 租约会续订,例如,您可以从位于 172.16.1.211 的同一设备的多个实例中看到。我认为我可以通过设置更长的租约来解决这个问题,因为我对 DHCP 工作原理的理解是租约在达到半衰期之前不会开始续订过程,但这是行不通的。

我还遇到了地址池耗尽的问题,因为我的租约太长了,而且我使用的 ASA 模型对其范围大小有硬性限制。

长话短说,我需要解析这些日志并检索其中一个日志中出现的唯一 MAC 地址的数量。关于如何使用 bash 完成此操作的任何想法?如果我知道如何从其中一个文件中提取该信息,我可以通过设置过程来使用 cron 或其他东西为所有这些文件执行此操作。我不是程序员,但是,我是网络工程师。任何帮助,将不胜感激。

谢谢,

最佳答案

Long story short, I need to parse those logs and retrieve the number of unique MAC addresses that occur in one of those logs.

是的,考虑到日志文件中数据的规律性,使用几种不同的工具可以很容易地做到这一点。

最基本的是使用cut

cut -d" " -f13 | sort | uniq -c

一个更高级的工具是 awk,它提供了许多逻辑增强功能,允许您根据需要添加任意数量的条件语句来过滤数据。对于你的情况,虽然它仍然很简单,

awk '{print $12}' | sort | uniq -c

在这两种情况下,cutawk,我只需要将数据中的字段数计算到感兴趣的值,然后将其指定为列(awk-speak 中的字段编号)。

(在测试这些答案时,我发现使用 cut 需要使用 -d""-f13(出于某种原因)。我认为 cut 默认为 -d"" 但我必须明确指定它才能使代码正常工作)。

当然,在这两个示例中,我都使用了 sortuniq 实用程序(man uniq 的操作方法)。 uniq,有几个选项,-c选项表示count,所以需要对数据进行排序,让counts正确累加(我在我原来的评论中错过了)。


举个例子,你可以扩展你的计数器来过滤每条记录前面的日期值

awk '/^Aug 23/{print $12}' | sort | uniq -c

但是还有更多的过滤和逻辑工具可以与 awk 一起使用。


如果您要定期处理日志文件数据(或其他非 XML 类数据),我建议您使用 Grymoire's Awk Tutorial .

健康教育

关于linux - 使用 bash 解析日志以获取唯一的 MAC 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46006580/

相关文章:

linux - 用两种模式拆分字符串

linux - 将文件中的行附加到另一个文件

linux - 在 vim 中编码时如何使用终端?

bash - 为什么用 "envsubst <file >file"重写一个文件会留空?

Bash 脚本比较两个日期变量

linux - Bash 函数在后台自动运行命令并拒绝

linux - 可以从内部暂停无特权的Docker容器吗?

linux - 为 memcached 命令编写 bash 脚本

bash - 使用 Bash 将单词从一个文件复制到另一个文件

linux - File(1) 将空字节分类为数据文件