如何仅显示每个块中第一行的少数指定列,即格式化 ifconfig 输出?

How to display only few specified columns from first row in each block, i.e. formatting ifconfig output?

有几个网络接口,虽然用 ifconfig 列出了所有接口,但我只想保留接口名称和 MTU。

换句话说,如何转换这样的东西:

$ ifconfig
cali0a56gaa5a33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8122
        inet6 fe80::ecee:eeff:feee:eeee  prefixlen 64  scopeid 0x20<link>
        ether ee:ee:ee:ee:ee:ee  txqueuelen 0  (Ethernet)
        RX packets 12890  bytes 129366676 (129.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16107  bytes 129601562 (129.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

cali4edac9c332d: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8122
        inet6 fe80::ecee:eeff:feee:eeee  prefixlen 64  scopeid 0x20<link>
        ether ee:ee:ee:ee:ee:ee  txqueuelen 0  (Ethernet)
        RX packets 111555  bytes 9806510 (9.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148838  bytes 151003850 (151.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

进入这个:

cali0a56gaa5a33: mtu 8122
cali4edac9c332d: mtu 8122

命令 $ ifconfig | awk '{ print " " " " }' 完成部分工作:显示 MTU,但也会显示所有缩进行。

您可以使用这个 awk:

ifconfig | awk 'NF > 1 && $(NF-1) == "mtu" {print , $(NF-1), $NF}'

cali0a56gaa5a33: mtu 8122
cali4edac9c332d: mtu 8122
  • 条件NF > 1 && $(NF-1) == "mtu"确定是否有超过1个字段且last-1字段值为mtu
  • print , $(NF-1), $NF 打印第一个、最后一个、最后一个字段

我将使用 GNU AWK 以下方式完成此任务,让 ifconfig 输出为

cali0a56gaa5a33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8122
        inet6 fe80::ecee:eeff:feee:eeee  prefixlen 64  scopeid 0x20<link>
        ether ee:ee:ee:ee:ee:ee  txqueuelen 0  (Ethernet)
        RX packets 12890  bytes 129366676 (129.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16107  bytes 129601562 (129.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

cali4edac9c332d: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8122
        inet6 fe80::ecee:eeff:feee:eeee  prefixlen 64  scopeid 0x20<link>
        ether ee:ee:ee:ee:ee:ee  txqueuelen 0  (Ethernet)
        RX packets 111555  bytes 9806510 (9.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148838  bytes 151003850 (151.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

然后

ifconfig | awk '/^[[:alnum:]]/{print ,,}'

输出

cali0a56gaa5a33: mtu 8122
cali4edac9c332d: mtu 8122

说明:我只为以字母数字字符开头的行选择了 print 字段,因此不包括缩进(以白色 space 开头)和空行。请注意,我使用 , 而不是与单个 space 连接,这会提示 GNU AWK 使用 OFS(输出字段分隔符)连接,默认情况下为 space.这允许将来轻松更改,例如,如果需要使用制表符而不是 spaces,添加 BEGIN{OFS="\t"} 就足够了,而不是更改每个 space.

(在 gawk 4.2.1 中测试)