我需要在新的macOS上找到所有的活动网络接口。这意味着使用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蒙特利,zsh和perl 5.34
谢谢你的帮助
马立克
发布于 2022-03-27 19:34:28
您可以使用
perl -0777 -nE 'say "$&" while /^[^\n\r\t:]+(?=:(?:.*\R\t)*status:\h+active)/gm'见正则试验。
在这里,-0777删除文件,以便正则表达式可以匹配多行文本跨度( M等效项将换行符暴露给pcregrep中的模式),say "$&"打印所有匹配的子字符串( o等效项,也请参见g标志)。
我编辑了[^\t:]+以匹配除制表符、冒号和CR/LF字符之外的任何一个或多个字符。另外,我将([^\n]|\n\t)*替换为一个更有效的(?:.*\R\t)*,它匹配除行中断字符(.*)、行中断序列(\R)和制表符字符(\t)结束之前的零或多个字符。
另外,请注意m标志使^锚点也匹配任何行开始位置。
发布于 2022-03-27 18:34:38
perl的-n和-p命令行开关在-e代码周围添加隐式while (<>) {.}块,此外,-p在每次迭代结束时打印行。因此,您需要将-p更改为-n,并且只打印出匹配的行;并删除多余的和不需要的while循环。所以就像
ifconfig | perl -ne 'print if /...../'https://stackoverflow.com/questions/71638153
复制相似问题