我想知道是否可以使用一个grep命令来处理以下情况。
我有一个dhcpd.conf文件,在该文件中定义了DHCP主机。给定主机名,我需要在dhcpd.conf文件中找到它的MAC地址。我需要使用它来禁用其PXE启动配置,但这不是本问题的一部分。
该文件的语法是统一的,但我仍然希望使它变得更加易用。以下是主机的定义方式:
host client1 { hardware ethernet 12:23:34:56:78:89; fixed-address 192.168.1.11; filename "pxelinux.0"; }
host client2 { hardware ethernet 23:34:45:56:67:78; fixed-address 192.168.1.12; filename "pxelinux.0"; }
host client3 { hardware ethernet AB:CD:EF:01:23:45; fixed-address 192.168.1.13; filename "pxelinux.0"; }
host client4 { hardware ethernet C1:CA:88:FA:F4:90; fixed-address 192.168.1.14; filename "pxelinux.0"; }
我们假设所有配置仅占用一行,尽管dhcpd.conf语法允许将选项分为几行。我们假设选项的顺序可能不同。
我想到了以下grep命令:
grep -o "^[^#]*host.*${DHCP_HOSTNAME}.*hardware ethernet.*..:..:..:..:..:..;" /etc/dhcp/dhcpd-hosts.conf
它应该忽略被注释的行,允许令牌之间存在任意空格,并匹配到MAC地址的结尾。当我运行它时,会得到这样的行:
host client1 { hardware ethernet 12:23:34:56:78:89;
这很不错!但是我只需要MAC地址,不需要前面的垃圾。现在我知道使用另一个grep、cut或awk从此输出中仅提取MAC地址将是微不足道的。但我想知道,是否有一种方法可以使用单个grep命令获得最终结果,而无需将此输出管道传递到另一个过滤器中?显然,我不能省略模式的开头,因为我想获取特定的主机名,因此匹配"
..:..:..:..:..:..
"将给我所有的MAC地址。再次强调,我想要一个单独的命令(不一定是grep),它从文件中仅剪切出正确的MAC地址。因此,我对任何解决方案都不感兴趣,“grep ... | grep ...”或“grep ... | cut ...”等等。
当然,在实践中,如果我使用多个过滤器并将它们连接起来,也不会发生什么不好的事情,我只是好奇是否可能用一个过滤器解决问题。
我希望将输出分配给一个变量。
$DHCP_HOSTNAME
的值吗?这样我们也可以进行测试。 - fedorquigrep -oP
与lookbehind和lookahead。 - Sundeep123
。 - Sundeepgrep -oP
... 如果它有效,你也可以将其作为自己的答案发布 :) - Sundeep