【问题标题】:Using bash to parse a log for unique MAC addresses使用 bash 解析日志以获取唯一 MAC 地址
【发布时间】:2017-09-03 22:05:09
【问题描述】:

我已将 Debian 机器设置为几个 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 或其他方式为所有这些文件执行此操作。我不是程序员,但是,我是网络工程师。任何帮助,将不胜感激。

谢谢,

【问题讨论】:

  • awk '{print $12}' file1 file2 ... | uniq -c ?如果这不能回答它,请通过在给定示例输入的情况下显示所需的输出来改进您的 Q。 (请在您的 Q 正文中执行此操作,而不是作为评论)。祝你好运。
  • 这对我有用。我想将此标记为答案,但我似乎不能(可能是因为它是评论?)不知道在协议方面该怎么做,但这肯定会奏效。谢谢。
  • 好的,如果您需要任何进一步的说明,请告诉我。祝你好运!

标签: linux bash


【解决方案1】:

长话短说,我需要解析这些日志并检索其中一个日志中出现的唯一 MAC 地址的数量。

是的,鉴于日志文件中数据的常规性质,使用多种不同的工具很容易做到这一点。

最基本的是使用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,所以需要对数据进行排序才能正确累积计数(我在原始评论中错过了这一点)。


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

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

但还有更多过滤和逻辑工具可供您使用awk


如果您要定期处理日志文件数据(或其他非 XML 类数据),我建议您通过 Grymoire's Awk Tutorial 工作。

IHTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2021-01-27
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多