如何仅显示每个块中第一行的少数指定列,即格式化 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 中测试)
有几个网络接口,虽然用 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 中测试)