gpt4 book ai didi

perl - 将 pcregrep 翻译成 Perl 一行代码

转载 作者:行者123 更新时间:2023-12-02 15:55:02 25 4
gpt4 key购买 nike

我需要在新的 macOS 上找到所有事件的网络接口(interface)。这意味着以下带有 pcregrep 的单行代码将不起作用:

ifconfig | pcregrep -M -o '^[^\t:]+(?=:([^\n]|\n\t)*status: active)'

因为 pcregrep 在 macOS 上没有默认安装。

我试图将它翻译成 egrep 但无济于事,因为不可能进行积极的前瞻,对吧?

所以我尝试在 perl 中使用单行代码。但是以下命令不起作用,因为开关 -pe 没有同时吞噬所有行。我也尝试过 -p0e

ifconfig | perl -pe 'while (<>) {if (/^[^\t:]+(?=:([^\n]|\n\t)*status: active)/){print "$1";};}'

如果我用正面前瞻性搜索同一行,它就可以工作;例如:

ifconfig | perl -pe 'while (<>) {if (/^([^\t:]+)(?=:([^\n]|\n\t)*mtu 1380)/){print "$1";};}'
utun0

ifconfig 的典型输出:

en10: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6467<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether 00:e0:4c:68:01:20
inet6 fe80::1470:31b9:a01c:6f5e%en10 prefixlen 64 secured scopeid 0xd
inet 192.168.178.39 netmask 0xffffff00 broadcast 192.168.178.255
inet6 2003:ee:4f1a:ce00:864:f90c:9a11:6ad9 prefixlen 64 autoconf secured
inet6 2003:ee:4f1a:ce00:d89a:7e34:6dd4:1370 prefixlen 64 autoconf temporary
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (1000baseT <full-duplex>)
status: active

预期的结果是:

en10

我在 macOS Monterey、zsh 和 perl 5.34 上

谢谢你的帮助

马可

最佳答案

由于ifconfig正常输出每个接口(interface)都有多行文本 block ,全部用空行分隔,方便分段阅读(-00) .那么剩下的就简单很多

ifconfig -a | perl -00 -nE'say $1 if /^(.+?)\s*:.*?status:\s+active/s'

我们仍然需要 /s 修饰符,使 . 也匹配一个换行符,因为每个段落本身都是一个多行字符串,模式需要跨多行匹配.


除了它不在用于此问题的 MacOS 上——没有空行分隔接口(interface) block 。那么寻找段落是没有意义的(在换行符上换行不是)并且这个答案不适用于该系统。

这是一个经典的逐行方法——在该接口(interface)输出的第一行设置接口(interface)名称(行首没有空格),然后测试事件状态

perl -wnE'$ifn=$1, next if /^(\S[^:]+?)\s*:/; say $ifn if /status:\s+active/' file

这允许在接口(interface)名称中使用空格,这是不太可能的(甚至可能不允许)。对于不允许在名称中使用空格的更具限制性的模式,请使用 /^(\S+?)\s*:/ (或更高效的 /^([^:\s]+)/). \s* 和前面的 ? 只是为了让它不捕获尾随空格(就在 : 之前),如果可能的话.

这也适用于界面 block 之间有空行的情况。

关于perl - 将 pcregrep 翻译成 Perl 一行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71638153/

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