我需要在新的 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 Monterey、zsh 和 perl 5.34
謝謝您的幫助
馬立克
uj5u.com熱心網友回復:
perl 的 -n 和 -p 命令列開關在 -e 代碼周圍添加了一個隱式 while (<>) {...} 塊,此外 -p 在每次迭代結束時列印該行。因此,您需要將 -p 更改為 -n 并僅列印出匹配的行;并洗掉多余的和不需要的 while 回圈。所以像
ifconfig | perl -ne 'print if /...../'
uj5u.com熱心網友回復:
您可以使用
perl -0777 -nE 'say "$&" while /^[^\n\r\t:] (?=:(?:.*\R\t)*status:\h active)/gm'
請參閱正則運算式測驗。
在這里,-0777slurps 檔案,以便正則運算式可以匹配多行文本跨度(將M換行符暴露給pcregrep中的模式的等價物),say "$&"列印所有匹配的子字串(o等價物,另見g標志)。
我編輯它[^\t:] 以匹配除制表符、冒號和 CR/LF 字符之外的任何一個或多個字符。此外,我替換([^\n]|\n\t)*為更有效(?:.*\R\t)*的匹配零個或多個除換行符以外的任何零個或多個字符的出現,直到行尾(.*),然后是換行符序列(\R),然后是制表符(\t)。
另外,請注意m使^錨點也匹配任何行起始位置的標志。
uj5u.com熱心網友回復:
鑒于ifconfig通常每個界面的輸出都有一個多行文本塊,以空行分隔,因此在段落中閱讀它很方便(-00)。然后剩下的就簡化了很多
ifconfig -a | perl -00 -nE'say $1 if /^([^:] )\s*:.*?status:\s active/s'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450420.html
標籤:perl 正则表达式环顾四周 如果配置 pcregrep
上一篇:在C#中處理檔案IO的空輸出
