用大括号解析块

时间:2017-08-09 09:13:10

标签: linux bash shell parsing grep

我正在尝试解析一个看起来像这样的dhcpd.conf文件:

authoritative;

subnet x.x.x.x netmask x.x.x.x {
    range x.x.x.x x.x.x.x;
    deny unknown-clients;
    default-lease-time 86400;
    max-lease-time 86400;
    option domain-name "bla";
    option domain-name-servers x.x.x.x;
    option broadcast-address x.x.x.x;
    option subnet-mask x.x.x.x;
    option routers x.x.x.x;

    host host1 {
            hardware ethernet 00:e1:4c:68:00:53;
            fixed-address 1.1.1.1;
    }

    host host2 {
            hardware ethernet 01:e2:4d:69:01:54;
            fixed-address 2.2.2.2;
    }

    host host3 {
            hardware ethernet 02:e3:4e:70:02:55;
            fixed-address 3.3.3.3;
    }

    host host4 {
            hardware ethernet 03:e4:4f:71:03:56;
            fixed-address 4.4.4.4;
    }

    host host5 {
            hardware ethernet 04:e5:5f:72:04:57;
            fixed-address 5.5.5.5;
    }
}

最后,我需要循环通过主机块(无论其名称)并将MAC地址和IP地址分配给变量以处理组合。到目前为止,我设法只使用一个变量:

for MAC in `cat /etc/dhcp/dhcpd.conf | grep "hardware ethernet" | awk '{ print $3 }' | tr ";" " "`
do
    echo "Found MAC address: " $MAC "Found IP: <I need the IP Variable here...>" 
done

也许最好以某种方式“grep”主机块以循环这些,但我不知道如何做到这一点。

有人能给我一个如何做到这一点的提示吗?

由于

1 个答案:

答案 0 :(得分:1)

鉴于输入文件的格式正确(MAC后跟IP),在sed之后,一个班轮将列出&#34; MAC,IP&#34; csv对。你可以解析它,做任何你想做的事。

sed -n '/\s*hardware ethernet/{s/\s*hardware ethernet \(.*\);/\1/;N;s/\([a-z0-9:]*\)\s*fixed-address \(.*\);/\1,\2/p}' /etc/dhcp/dhcpd.conf

输出:

00:e1:4c:68:00:53,1.1.1.1
01:e2:4d:69:01:54,2.2.2.2
02:e3:4e:70:02:55,3.3.3.3
03:e4:4f:71:03:56,4.4.4.4
04:e5:5f:72:04:57,5.5.5.5

要生成与示例中一样的确切输出,

sed -n '/\s*hardware ethernet/{s/\s*hardware ethernet \(.*\);/\1/;N;s/\([a-z0-9:]*\)\s*fixed-address \(.*\);/Found MAC address: \1, Found IP: \2/p}' /etc/dhcp/dhcpd.conf

输出:

Found MAC address: 00:e1:4c:68:00:53, Found IP: 1.1.1.1
Found MAC address: 01:e2:4d:69:01:54, Found IP: 2.2.2.2
Found MAC address: 02:e3:4e:70:02:55, Found IP: 3.3.3.3
Found MAC address: 03:e4:4f:71:03:56, Found IP: 4.4.4.4
Found MAC address: 04:e5:5f:72:04:57, Found IP: 5.5.5.5

修改

您可以从每对中提取MAC和IP,并按如下方式对其进行操作。

for v in $(sed -n '/\s*hardware ethernet/{s/\s*hardware ethernet \(.*\);/\1/;N;s/\([a-z0-9:]*\)\s*fixed-address \(.*\);/\1,\2/p}' /etc/dhcp/dhcpd.conf); do
    mac="${v%,*}"
    ip="${v#*,}"
    echo "MAC: $mac"
    echo "IP: $ip"
done