convert pcregrep command in awk or sed
我有一个多行匹配的pcregrep命令,我想将其转换为awk或sed命令,因为我需要在pcregrep不可用的计算机(OS X)上使用它。
原始命令:
1 2 3 4 5 | ifconfig -a | pcregrep -M '^[a-z].*\ (\\t[^\ ]+\ )+\\t[^\ ]+baseTX' | grep -oE"^([a-z]+[^:]+)" |
它输出包含字符串a?baseTXa?的接口的名称。 (这是我发现可以可靠地找出MacBook上以太网接口名称的唯一方法)。就我而言,是€en4a€。
输入文本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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 |
我该如何抓取?en4a€?用awk还是sed?我试了一个小时,但我对sed和awk不好。
假设间距是一致的(前导空格仅在非标题行上),这应该起作用:
1 | awk -F: '/^[[:alpha:]]/ {iface=$1; next} /baseTX/ {print iface; exit}' |
perl:
1 | perl -0777 -nE 'say map {/^\\w+/ && $&} grep {/baseTX/} split /^(?=\\w+:)/m' |