使用 Bash 解析 dhcpd.lease 文件

fwa*_*ter 4 bash grep parsing

我尝试用巴塞尔解析我的 dhcpd.lease 文件。典型的条目如下所示:

lease 192.168.20.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
Run Code Online (Sandbox Code Playgroud)

我得到的所有信息都是 MAC,我想要的是 IP 和客户端主机名。但也许,没有客户端主机名。该条目如下所示:

lease 192.168.20.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是 grep 租赁属性、硬件以太网属性和 uid 属性,并将它们全部放在一行上。然后解析它。

但我的问题是,我有一个大文件,在许多文件中分配了许多条目。树看起来像这样:

dhcpd-leases
-- 192.168.20.0
-- 192.168.30.0
-- 192.168.40.0
[...]
Run Code Online (Sandbox Code Playgroud)

我得到的所有东西都是从另一个文件解析到列表中的 MAC。所以我从这个列表开始,想用我的 MAC 来 grep 属性 ip, mac:

for ENTRY in $MACLIST
do
    VAR$(cat "dhcpd-leases/10.148.$NETWORK.2/dhcpd.leases" | grep -E "$MAC|lease|client-hostname")
    echo $VAR
done
Run Code Online (Sandbox Code Playgroud)

但这是因为 $VAR 中的许多条目和文件我无法正确解析它。

有人可以帮忙吗?

最好的问候彼得

gho*_*g74 5

假设您的 maclist 文件如下所示(例如,只有一个条目)

$ cat maclist
00:00:00:00:00:01
Run Code Online (Sandbox Code Playgroud)

和你的租约文件是这样的

$ cat file
lease 192.168.20.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}

lease 192.168.20.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}

lease 192.168.20.6 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:01;
    uid 00:00:00:00:00:01;
    client-hostname "examle-workstation2";
}


lease 192.168.20.7 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 01:00:00:00:00:00;
}
Run Code Online (Sandbox Code Playgroud)

你可以试试这个

awk 'BEGIN{
    while( (getline line < "maclist") > 0){
        mac[line]
    }
    RS="}"
    FS="\n"
}
/lease/{
    for(i=1;i<=NF;i++){
        gsub(";","",$i)
        if ($i ~ /lease/) {
            m=split($i, IP," ")
            ip=IP[2]
        }
        if( $i ~ /hardware/ ){
            m=split($i, hw," ")
            ether=hw[3]
        }
        if ( $i ~ /client-hostname/){
            m=split($i,ch, " ")
            hostname=ch[2]
        }
        if ( $i ~ /uid/){
            m=split($i,ui, " ")
            uid=ui[2]
        }
    }
    if ( ether in mac ){
        print "ip: "ip " hostname: "hostname " ether: "ether " uid: "uid
    }
} ' file
Run Code Online (Sandbox Code Playgroud)

输出

$ ./shell.sh
hostname: "examle-workstation2" ether: 00:00:00:00:00:01 uid: 00:00:00:00:00:01
Run Code Online (Sandbox Code Playgroud)