在awk或sed中转换pcregrep命令

在awk或sed中转换pcregrep命令,awk,sed,multiline,pcregrep,Awk,Sed,Multiline,Pcregrep,我有一个多行匹配的pcregrep命令,我想将其转换为awk或sed命令,因为在pcregrep不可用的机器上(OS X)需要它 原始命令: ifconfig -a | pcregrep -M '^[a-z].*\n(\t[^\n]+\n)+\t[^\n]+baseTX' | grep -oE "^([a-z]+[^:]+)" 它输出包含字符串“baseTX”的接口名称(我在MacBook上找到的唯一可靠查找以太网接口名称的方法)。就我而言,“en4” 输入文本如下所示: lo0: flags

我有一个多行匹配的pcregrep命令,我想将其转换为awk或sed命令,因为在pcregrep不可用的机器上(OS X)需要它

原始命令:

ifconfig -a | pcregrep -M '^[a-z].*\n(\t[^\n]+\n)+\t[^\n]+baseTX' | grep -oE "^([a-z]+[^:]+)"
它输出包含字符串“baseTX”的接口名称(我在MacBook上找到的唯一可靠查找以太网接口名称的方法)。就我而言,“en4”

输入文本如下所示:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=1<PERFORMNUD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether xx:xx:xx:xx:xx:xx 
    inet6 xxxx::xxxx:xxxx:xxxx:xxx%en0 prefixlen 64 scopeid 0x4 
    inet 10.xxx.xxx.xx netmask 0xffffff00 broadcast 10.xxx.xxx.255
    inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 128 
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: active
en5: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect <full-duplex>
    status: inactive
en6: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect <full-duplex>
    status: inactive
en4: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=4<VLAN_MTU>
    ether xx:xx:xx:xx:xx:xx 
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx%en4 prefixlen 64 scopeid 0x7 
    inet XX.XXX.XXX.XX netmask 0xffffff00 broadcast XX.XXX.XXX.XXX
    inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 128 
    nd6 options=1<PERFORMNUD>
    media: autoselect (100baseTX <full-duplex>)
    status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether xx:xx:xx:xx:xx:xx 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en5 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 5 priority 0 path cost 0
    member: en6 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 6 priority 0 path cost 0
    nd6 options=1<PERFORMNUD>
    media: <unknown type>
    status: inactive
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect
    status: inactive
lo0:flags=8049 mtu 16384
选项=3
inet6::1预桥128
inet 127.0.0.1网络掩码0xff000000
inet6 fe80::1%lo0预桥64作用域ID 0x1
nd6选项=1
gif0:标志=8010 mtu 1280
stf0:标志=0 mtu 1280
en0:标志=8863 mtu 1500
乙醚xx:xx:xx:xx:xx:xx:xx
inet6 xxxx::xxxx:xxxx:xxxx:xxx%en0前缀轴64作用域ID 0x4
inet 10.xxx.xxx.xx网络掩码0xffffff00广播10.xxx.xxx.255
inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx前缀轴128
nd6选项=1
媒体:自动选择
状态:活动
en5:标志=8963 mtu 1500
选项=60
乙醚xx:xx:xx:xx:xx:xx:xx
媒体:自动选择
状态:不活跃
en6:标志=8963 mtu 1500
选项=60
乙醚xx:xx:xx:xx:xx:xx:xx
媒体:自动选择
状态:不活跃
en4:标志=8863 mtu 1500
选项=4
乙醚xx:xx:xx:xx:xx:xx:xx
inet6 xxxx::xxxx:xxxx:xxxx:xxxx%en4前缀轴64作用域ID 0x7
inet XX.XXX.XXX.XX网络掩码0xffffff00广播XX.XXX.XXX.XXX
inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx前缀轴128
nd6选项=1
介质:自动选择(100baseTX)
状态:活动
桥0:flags=8863 mtu 1500
选项=63
乙醚xx:xx:xx:xx:xx:xx:xx
配置:
id 0:0:0:0:0:0优先级0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100超时1200
根id 0:0:0:0:0:0优先级0如果成本0端口0
ipfilter禁用标志0x2
成员:en5标志=3
ifmaxaddr 0端口5优先级0路径成本0
成员:en6标志=3
ifmaxaddr 0端口6优先级0路径成本0
nd6选项=1
媒体:
状态:不活跃
p2p0:标志=8843 mtu 2304
乙醚xx:xx:xx:xx:xx:xx:xx
媒体:自动选择
状态:不活跃

如何使用awk或sed绘制“en4”?我试了一个小时,但我在sed和awk方面做得不好。

假设间距一致(前导空格仅在非标题行上),这应该可以:

awk -F: '/^[[:alpha:]]/ {iface=$1; next} /baseTX/ {print iface; exit}'

假设间距一致(前导空格仅在非标题行上),这应该可以:

awk -F: '/^[[:alpha:]]/ {iface=$1; next} /baseTX/ {print iface; exit}'
perl:

perl:


您有
ip
命令吗?
ip addr显示什么
output?sed是在单行上进行简单替换的唯一正确工具。一旦你开始谈论任何涉及选择或在多行上操作的事情,你应该使用awk。我没有ip命令。谢谢你推荐Ed,我会记住这一点。你有
ip
命令吗?
ip addr显示什么
output?sed是在单行上进行简单替换的唯一正确工具。一旦你开始谈论任何涉及选择或在多行上操作的事情,你应该使用awk。我没有ip命令。谢谢你的推荐Ed,我会记住的。太棒了。我很接近,但我试图用awk制作太复杂的东西,结果非常简单。简单是困难的;)简单肯定很难。这就是为什么我最喜欢的正则表达式规则(但几乎适用于所有地方)是“不要试图匹配超过你所关心的”。太棒了。我很接近,但我试图用awk制作太复杂的东西,结果非常简单。简单是困难的;)简单肯定很难。这就是为什么我最喜欢的正则表达式规则(但几乎适用于所有地方)是“不要试图匹配超过你所关心的”。