我有以下输入:
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)
这是来自linux中的lspci
,它显然显示了以太网/无线设备及其相应的pci ID。在这种情况下,输出显示系统有1个四端口BCM690 nic(我做了),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更好的工作工具,那么请指点我。)
答案 0 :(得分: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}'