【发布时间】:2019-05-22 05:30:00
【问题描述】:
需要 sed 魔法:
我想知道如何在不立即打印的情况下保存/记住一行中的匹配项(如标题部分)
如果在后面的某处找到其他匹配项,则打印它,
但保存/记住的标题部分应该只打印一次,用于该标题下的任意数量的后续其他匹配
如果在记住的标题行下方的任何后续行中没有其他内容匹配,则根本不应该打印它
例如ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.94.0.2 netmask 0xff000000
inet 127.94.0.1 netmask 0xff000000
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en3: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
ether 68:5b:35:c1:b3:91
inet6 fe80::8ef:5953:53b:7058%en3 prefixlen 64 secured scopeid 0x5
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
inet6 2a02:810d:9c0:59bb:c0d:c8af:7e27:42f1 prefixlen 64 autoconf secured
inet6 2a02:810d:9c0:59bb:643f:a2cb:ac5f:7c71 prefixlen 64 autoconf temporary
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>)
status: active
en0: flags=8823<UP,BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500
ether 6c:40:08:9c:45:ce
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (<unknown type>)
status: inactive
ifconfig | gsed -n -E '/^[a-z0-9]*:/h; /\tinet (addr:)?[0-9.a-fA-F:]*/{x;p;x;p}'
我明白了(这已经很棒了,但不是很好):
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.94.0.2 netmask 0xff000000
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.94.0.1 netmask 0xff000000
en3: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
但我只想为它的所有 ips 获取一次标题(并且没有混乱)
lo0:
inet 127.0.0.1
inet 127.94.0.2
inet 127.94.0.1
en3:
inet 192.168.0.2
【问题讨论】:
-
不要解析 ifconfig 输出,它已经过时了。移至
ip a。