相关疑难解决方法(0)

在perl中使用-e和-s开关

我开始学习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开关一起使用..为什么不能正常工作?

perl

6
推荐指数
1
解决办法
617
查看次数

使用grep仅显示比赛的一部分

我对是否可以在以下情况下使用单个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 ...”等的解决方案不感兴趣。

当然,在实践中,如果我使用多个过滤器并将其通过管道传输,也不会发生任何不好的情况,我很好奇是否可以使用一个过滤器来解决。

我会将输出分配给变量。

unix linux shell grep gnu

5
推荐指数
1
解决办法
1648
查看次数

标签 统计

gnu ×1

grep ×1

linux ×1

perl ×1

shell ×1

unix ×1