2

我有以下输入:

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)                                                                                                    

这是来自lspcilinux 的,它显然显示了以太网/无线设备及其相应的 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 更好的工具来完成这项工作,请也向我指出。)

4

1 回答 1

3
awk '{$1 = ""; sub(" ", ""); arr[$0]++} END {for (i in arr) {print arr[i], i}}' 

丢弃第一个字段和第一个字段分隔符。使用该行的其余部分作为计数器数组的索引。最后打印计数和索引。

这是一个打印端口数的版本(分成多行):

awk '
    {
        split($1, slot, ":");
        $1 = "";
        sub(" ", ""); 
        split($0, type, ":");
        iface[type[2]]++;
        if (!(slot[1] SUBSEP type[2] in slots)) {
            slots[slot[1], type[2]];
            slotcount[type[2]]++
        }
    }
    END {
        for (ifacetype in iface) {
            slotc = slotcount[ifacetype];
            typec = iface[ifacetype]
            ports = "";
            if (typec > 1) {
                ports = " {" slotc "x" typec/slotc "-port}"
            };
            print typec, ifacetype, ports
        }
    }'

将槽信息保存在数组中。丢弃第一个字段和第一个分隔符。计算接口。如果我们以前没有见过这个槽,记住它(简单地指一个数组元素创建它)。计算该接口类型的插槽数。

对于每种接口类型,获取插槽计数和该类型的计数。打印信息。每个接口的端口数是一种类型的计数除以该类型接口占用的插槽数。

顺便说一下,这个双重测试:

'/Eth|Net/{if ($2 ~ /^Eth|^Net/) print}'

可以简化为:

'$2 ~ /^Eth|^Net/ {print}'
于 2012-07-07T01:24:04.177 回答