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コマンド出力の4番目の列を選択するのに役立ちます。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}

おすすめ記事