我开始学习Perl.我试过了
perl -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)
得到:
The value of $x=
Run Code Online (Sandbox Code Playgroud)
然而:
perl -s -x=10 -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)
给
No Perl script found in input
Run Code Online (Sandbox Code Playgroud)
我想将-s
开关与-e
开关一起使用..为什么不能正常工作?
我对是否可以在以下情况下使用单个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"; }
Run Code Online (Sandbox Code Playgroud)
我们假定所有配置仅占用一行,即使dhcpd.conf语法允许将选项分成几行也是如此。我们假设选项的顺序可能不同。
我想出了以下grep命令:
grep -o "^[^#]*host.*${DHCP_HOSTNAME}.*hardware ethernet.*..:..:..:..:..:..;" /etc/dhcp/dhcpd-hosts.conf
Run Code Online (Sandbox Code Playgroud)
应该忽略那些被注释的行,在令牌之间允许任意空格,并匹配直到MAC地址的末尾。当我运行它时,我得到如下代码:
host client1 { hardware ethernet 12:23:34:56:78:89;
Run Code Online (Sandbox Code Playgroud)
这很棒!但是关键是我只需要一个MAC地址,而没有前面的垃圾桶。现在我知道,使用另一个grep或cut或awk仅从此输出中剪切MAC地址将是微不足道的。但我想知道,是否有一种方法可以使用单个grep命令来获得最终结果,而不必将此输出通过管道传递到另一个过滤器中?显然,我不能忘记模式的开头,因为我想获得一个特定的主机名,因此匹配“ ..:..:..:..:..:..
”将为我提供所有MAC地址。
再一次,我想要一个命令(不一定是grep),该命令仅从文件中切出正确的MAC地址。因此,我对那些说“ grep ... | grep ...”或“ grep ... | cut ...”等的解决方案不感兴趣。
当然,在实践中,如果我使用多个过滤器并将其通过管道传输,也不会发生任何不好的情况,我很好奇是否可以使用一个过滤器来解决。
我会将输出分配给变量。