lsusb |查询 | awk 命令正在截断第一个结果

lsusb |查询 | awk 命令正在截断第一个结果

我正在尝试针对 lsusb 运行 usbreset 程序,该程序有多个具有相同设备标识符的设备。

我运行 lsusb 来列出设备,并添加 | grep [identifer] 仅列出具有该标识符的设备。

然后我需要运行 awk 命令来获取总线和设备号,它将被插入到 usbreset 程序中(https://github.com/jkulesza/usbreset)这将重置所有与该 ID 匹配的设备。

该命令如下所示:

lsusb | grep 1234:a1b1 | while read line ; do awk -F '[^0-9]+' '{ system("sudo ./usbreset /dev/bus/usb/002/"$3) }'; done

where-F '[^0-9]+'帮助删除设备号末尾的“:”,并$3选择 lsusb 命令输出的第四列:Bus 002 Device 010: ID 1234:a1b1

这工作得很好,但我遇到的问题是我有 6 个具有此 id 的设备,并且 awk 命令截断了第一个结果,并且只打印 5。

user@localhost:~$ lsusb | grep 1234:a1b1
Bus 002 Device 015: ID 1234:a1b1
Bus 002 Device 014: ID 1234:a1b1
Bus 002 Device 013: ID 1234:a1b1
Bus 002 Device 010: ID 1234:a1b1
Bus 002 Device 009: ID 1234:a1b1
Bus 002 Device 008: ID 1234:a1b1

和:

user@localhost:~$ lsusb | grep 1234:a1b1 | while read line ; do awk -F '[^0-9]+' '{ print $3 }'; done
014
013
010
009
008

任何帮助找出我哪里出了问题的建议都会很棒!

答案1

该行消失是因为read line调用,而不是 AWK。我会以不同的方式处理这个问题:

lsusb -d 1234:a1b1 | while read _ bus _ device _; do
    sudo ./usbreset "/dev/bus/usb/${bus}/${device%:}"
done

它使用lsusb自己的能力来过滤设备,然后将总线和设备标识符读取到相应的变量中,并为 提供适当的值usbreset,并从 中去除尾随的“:” ${device}

答案2

@StephenKitt 的 shell 循环在这种情况下很好,因为效率可能不是问题,并且输入格式众所周知且简单,并且您不仅仅是操作文本(请参阅为什么使用 shell 循环来处理文本被认为是不好的做法)但不编写循环的另一种选择可能是:

lsusb -d '1234:a1b1' |
    awk -F'[ :]' '{printf "/dev/bus/usb/%s/%s\n", $2, $4}' |
    xargs -n 1 sudo ./usbreset

相关内容