gpt4 book ai didi

regex - 将日志输出更改为linux中的配置文件

转载 作者:太空狗 更新时间:2023-10-29 12:03:30 25 4
gpt4 key购买 nike

基本上我有一个 DHCP 服务器日志的输出,看起来像这样:

  hardware ethernet 00:16:41:ef:9e:47;
client-hostname "mo-10";
hardware ethernet 00:11:25:73:20:a5;
client-hostname "mo-11";
hardware ethernet 00:11:25:73:20:a5;
client-hostname "mo-11";
hardware ethernet 00:11:25:73:20:a5;
client-hostname "mo-11";
hardware ethernet 00:16:41:ef:9e:47;
client-hostname "mo-10";
hardware ethernet 00:11:25:73:21:35;
client-hostname "mo-23";

每两行连在一起——第一行是网络上设备的 MAC 地址,第二行是主机名。我想获取列表,并将每一对行放入我的 dhcp 服务器的配置 block 中,如下所示:

    host mo-10 {
hardware ethernet 00:16:41:ef:9e:47;
fixed-address 192.168.1.10;
}

host 之后的部分应该与 client-hostname 相同,硬件以太网 block 应该相同,固定地址应该始终是 192.168.1.x,其中 x 是主机名中的数字(因此对于主机 mo- 10 ip 应该是 192.168.1.10,mo-23 应该是 192.168.1.23 等等)一切都应该用大括号括起来。另外还有很多重复的条目,我想删除。我尝试过使用 grep 和 awk,但我不太擅长在 bash 中操作文本,这对我来说太复杂了。如果有人能提供一种方法来实现这一点并解释它为什么有效,我会很高兴。

非常感谢。

最佳答案

这是一种实现方式:

awk '
NR%2 { eth = $0; next }
{ gsub(/[";]/,""); map[$NF] = eth }
END {
for (host in map) {
split (host, t, /-/);
print "host " host " {\n\t" map[host], RS, "\tfixed-ethernet 192.168.1."t[2]";" RS "}"
}
}' file
host mo-10 {
hardware ethernet 00:16:41:ef:9e:47;
fixed-ethernet 192.168.1.10;
}
host mo-11 {
hardware ethernet 00:11:25:73:20:a5;
fixed-ethernet 192.168.1.11;
}
host mo-23 {
hardware ethernet 00:11:25:73:21:35;
fixed-ethernet 192.168.1.23;
}

将奇数行存储在变量 eth 中。对于偶数行,您删除引号和 ; 并创建一个以主机名为键的散列,值为 line。在 END block 中,您迭代哈希并将主机名拆分为 -

然后您只需打印您想要的输出即可。

关于regex - 将日志输出更改为linux中的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com