Linux环境下如何解析提取PCIe NVMe设备对应的PCI地址?
NVMe设备PCI地址提取方案
以下方案均基于你给出的示例路径 /sys/devices/pci0000:00/0000:00:01.2/0000:01:00.2/0000:02:00.0/0000:03:00.0/nvme/nvme0 测试,可直接嵌入bash脚本使用。
方案1:纯bash内置操作(性能最优,无外部依赖)
不需要调用sed/awk等外部工具,适合脚本高频调用场景:
# 替换为你的设备路径变量 dev_path="/sys/devices/pci0000:00/0000:00:01.2/0000:01:00.2/0000:02:00.0/0000:03:00.0/nvme/nvme0" # 第一步:截断/nvme/及之后的所有内容 temp_path="${dev_path%/nvme/*}" # 第二步:提取最后一段路径即PCI地址 pci_addr="${temp_path##*/}" # 输出结果为 0000:03:00.0 echo $pci_addr
方案2:sed单行命令
适合管道流式处理场景:
echo "$dev_path" | sed -E 's/.*\/([0-9a-fA-F:.]+)\/nvme\/.*/\1/'
方案3:awk单行命令
适合多字段同时处理的场景:
awk -F'/nvme/' '{split($1, arr, "/"); print arr[length(arr)]}' <<< "$dev_path"
批量获取所有NVMe设备PCI地址示例
如果需要遍历本机所有NVMe设备批量提取地址,可以直接用以下片段:
for nvme_dev in /sys/class/nvme/nvme*; do [[ -e "$nvme_dev" ]] || continue dev_path=$(readlink -f "$nvme_dev") temp_path="${dev_path%/nvme/*}" pci_addr="${temp_path##*/}" echo "NVMe设备$(basename $nvme_dev) 对应PCI地址:$pci_addr" done
注意事项
可以提前加路径合法性判断避免异常输入报错:
[[ "$dev_path" =~ /nvme/ ]] || { echo "无效的NVMe设备路径"; exit 1; }
内容的提问来源于stack exchange,提问作者Nell69Rock
相关产品推荐
相关产品推荐

