我有以下输入:
03:00.0 Ethernet controller: Broadcom Corporation NetBooty BCM5111 Gigabit Ethernet (rev 59)
03:00.1 Ethernet controller: Broadcom Corporation NetBooty BCM5111 Gigabit Ethernet (rev 59)
03:00.2 Ethernet controller: Broadcom Corporation NetBooty BCM5111 Gigabit Ethernet (rev 59)
03:00.3 Ethernet controller: Broadcom Corporation NetBooty BCM5111 Gigabit Ethernet (rev 59)
04:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
04:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
05:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
05:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
06:00.0 Network controller: Intel Corporation Centrino Ultimate-N 6300 (rev 3e)
这是来自lspci
linux 的,它显然显示了以太网/无线设备及其相应的 pci id。在这种情况下,输出显示系统有 1 个四端口 BCM690 网卡(我编的)、2 个双端口 BCM5709 和一个 Intel 6300 wifi 控制器。
我正在尝试编写可以处理该问题的 awk 逻辑(以及在更多接口系统上更详细的输出),并打印一个简洁的摘要。建议的输出格式,给定上述输入:
4 Broadcom Corporation NetBooty BCM5111 Gigabit Ethernet (rev 59) {1x4-port}
4 Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) {2x2-port}
1 Intel Corporation Centrino Ultimate-N 6300 (rev 3e)
以我有限的 awk 知识,到目前为止,我只取得了轻微的成功。这就是我所拥有的,但请注意,我经常查看包含lspci -v
其他系统输出的文件,因此需要额外的'/Eth|Net/{if ($2 ~ /^Eth|^Net/) print}'
逻辑来确保我得到正确的东西。
awk '/Eth|Net/{if ($2 ~ /^Eth|^Net/) print}' lspci.txt |
awk -F: '{if ($2 ~ /^...0/) pci[$1$2]=$3; count[$3]++} END {for (i in pci) printf "%s %s\n", count[pci[i]], pci[i]}' |
uniq -c |
awk '{nic=""; for (i=3; i <=NF; i++) nic = nic $i " "; if ($1 == 1) printf "%s %s\n", $2, nic; if ($1 != 1) printf "%s %s {%dx%d-port}\n", $2, nic, $1, $2/$1}'
这主要会产生所需的输出,但是呃......我很想把它归结为一个 awk 命令。任何反馈表示赞赏。例子更好。我不需要说明答案;我只需要指出一些类似事情的例子。(如果您有比 awk 更好的工具来完成这项工作,请也向我指出。)