我正在尝试针对 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