lsusb |query|awk 명령이 첫 번째 결과를 자릅니다.

lsusb |query|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

여기서 -F '[^0-9]+'help는 장치 번호 끝에 있는 ":"을 제거하고 $3lsusb 명령 출력의 네 번째 열을 선택하는 데 도움이 됩니다.Bus 002 Device 010: ID 1234:a1b1

이것은 잘 작동하지만 내가 겪고 있는 문제는 이 ID를 가진 장치가 6개 있고 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 lineAWK가 아닌 호출 로 인해 회선이 사라집니다 . 나는 이 문제에 다르게 접근할 것입니다:

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

이는 lsusb장치를 필터링하는 기능을 사용하고 버스 및 장치 식별자를 해당 변수로 읽어와 적절한 값을 제공하고 usbreset뒤따르는 ":"을 제거합니다 ${device}.

답변2

@StephenKitt의 쉘 루프는 효율성이 문제가 되지 않을 것이고, 입력 형식이 잘 알려져 있고 단순하며, 단순히 텍스트를 조작하는 것이 아니기 때문에 이 경우에 좋습니다(참조쉘 루프를 사용하여 텍스트를 처리하는 것이 나쁜 습관으로 간주되는 이유) 그러나 루프를 작성하지 않는 또 다른 옵션은 다음과 같습니다.

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

관련 정보