#!/bin/bash

# 获取所有网卡列表（排除 lo 和虚拟设备）
interfaces=($(ip -o link show | awk -F': ' '{print $2}' | grep -E '^[a-zA-Z0-9]+$'))

# 如果没有可用网卡，退出
if [ ${#interfaces[@]} -eq 0 ]; then
    echo "没有可用的网卡！"
    exit 1
fi

# 提供网卡选择菜单
echo "请选择一个网卡:"
select iface in "${interfaces[@]}"; do
    if [[ -n "$iface" ]]; then
        echo "你选择了网卡: $iface"
        break
    else
        echo "无效选择，请重新输入！"
    fi
done

# 显示 tc 统计信息
echo "正在获取 $iface 的流控队列状态..."

# 获取队列数据并保存到临时文件
tc -s qdisc show dev $iface > tc_temp.txt

# 运行awk脚本处理数据（这里是前面那段完整的awk代码）
awk '
# 16进制转10进制函数
function hex2dec(hex) {
    gsub("1:", "", hex);
    hex = toupper(hex);
    dec = 0;
    split("0 1 2 3 4 5 6 7 8 9 A B C D E F", digits, " ");
    for (i = 1; i <= 16; i++) {
        hexdigits[digits[i]] = i - 1;
    }
    n = length(hex);
    for (i = 1; i <= n; i++) {
        dec = dec * 16 + hexdigits[substr(hex, i, 1)];
    }
    return dec;
}

# 格式化大数字，添加千位分隔符
function format_number(num) {
    str = "";
    num_str = num "";
    len = length(num_str);
    for (i = 1; i <= len; i++) {
        str = str substr(num_str, i, 1);
        if ((len - i) % 3 == 0 && i != len) str = str ",";
    }
    return sprintf("%20s", str);
}

BEGIN {
    queue_type="";
    queue_id="";
}

/qdisc/ {
    queue_type=$2;
    if ($4 == "parent") {
        queue_id=$5;
    } else {
        queue_id="root";
    }
    if ($2 == "ingress") {
        queue_id = "ingress";
    }
}

/ Sent/ {
    if (queue_type != "") {
        sent=$2;
        split($0, a, "dropped ");
        split(a[2], b, ",");
        dropped=b[1];
        
        split($0, c, "overlimits ");
        split(c[2], d, " ");
        overlimits=d[1];
        
        split($0, e, "requeues ");
        split(e[2], f, ")");
        requeues=f[1];
        
        sent_fmt = format_number(sent);
        
        if (queue_id == "root") {
            printf("001|队列号: %-8s 队列类型: %-7s 已发送: %s 字节 丢弃: %-6s 超限: %-6s 重排队: %-6s\n",
                "root", queue_type, sent_fmt, dropped, overlimits, requeues);
        } else if (queue_id == "ingress") {
            printf("002|队列号: %-8s 队列类型: %-7s 已发送: %s 字节 丢弃: %-6s 超限: %-6s 重排队: %-6s\n",
                "ingress", queue_type, sent_fmt, dropped, overlimits, requeues);
        } else if (queue_id ~ /^1:/) {
            dec = hex2dec(queue_id);
            printf("100%03d|队列号: %-8s 队列类型: %-7s 已发送: %s 字节 丢弃: %-6s 超限: %-6s 重排队: %-6s\n",
                dec, queue_id, queue_type, sent_fmt, dropped, overlimits, requeues);
        }
    }
}' tc_temp.txt | sort -t'|' -k1n | cut -d'|' -f2-

# 删除临时文件
rm -f tc_temp.txt
# 结束提示
echo "队列状态查询完成！"