Я хочу вернуть только некоторые данные моего любимого принтера. (Имя всегда содержит STMicroelectronics printer
Я могу распечатать все подключенные USB-устройства с помощью команды lsusb
. Это даст мне (первая строка, очевидно, является принтером):
Bus 001 Device 004: ID 0483:5743 STMicroelectronics printer-80
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub`
Теперь я могу найти информацию об устройстве через lsusb -vvv -d 0483:5743
, который возвращает:
Bus 001 Device 004: ID 0483:5743 STMicroelectronics printer-80
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 STMicroelectronics
idProduct 0x5743
bcdDevice 1.00
iManufacturer 1 Printer
iProduct 2 printer-80
iSerial 3 012345678AB
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 2mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 7 Printer
bInterfaceSubClass 1 Printer
bInterfaceProtocol 2 Bidirectional
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0001
Self Powered
Теперь... Как я могу просто вернуть эти данные через bash:
idVendor (0x0483)
idProduct (0x5743)
endpointOUT (0x01)
endpointIN (0x81)
Должна быть какая-то магия grep/regex, которую я просто не смог освоить.
Спасибо за любую помощь заранее!
Поиск решений для извлечения строки, содержащей описание принтера, с помощью регулярного выражения.
Предлагаю посмотреть awk
.
Предлагаю следующий awk
сценарий:
awk '/idVendor/||/idProduct/{printf("%s (%s)\n", $1,$2)}/bEndpointAddress/{printf("endpoint%s (%s)\n", $NF, $2)}' <<<$(lsusb -vvv -d 0483:5743)
Это работает отлично, но сначала мне нужно выяснить идентификаторы поставщика и продукта. (Они каждый раз разные). Таким образом, чтобы передать аргумент -d, мне нужно взять его из первого вывода lsusb. Дело в том... принтер не всегда отображается в первой строке, но в строке всегда есть описание "STMicroelectronics принтер-80"... Есть еще идеи?
Ответ решить поставленный вопрос. Пожалуйста, создайте новый вопрос. Укажите образец ввода, образец вывода и вашу попытку.
Использование GNU sed
$ sed -En 's/[ \t]*b?(id[vp][^ \t]*|endpoint)(address)?[ \t]+([^ \t]*).* (out|in)?.*/\l\1\4 (\3)/Ip' <(lsusb | awk '$0 ~ /STMicroelectronics printer-80/{print $6}' | xargs -I % sh -c "lsusb -vvv -d %")
idVendor (0x0483)
idProduct (0x5743)
endpointOUT (0x01)
endpointIN (0x81)
Это работает отлично, но сначала мне нужно выяснить идентификаторы поставщика и продукта. (Они каждый раз разные). Таким образом, чтобы передать аргумент -d, мне нужно взять его из первого вывода lsusb. Дело в том... принтер не всегда отображается в первой строке, но в строке всегда есть описание "STMicroelectronics принтер-80"... Есть еще идеи?
Это работает? sed -En 's/[ \t]*b?(id[vp][^ \t]*|endpoint)(address)?[ \t]+([^ \t]*).* (out|in)?.*/\l\1\4 (\3)/Ip' <(lsusb | awk '$0 ~ /STMicroelectronics printer-80/{print $6}' | xargs -I % sh -c "lsusb -vvv -d %")
@DatabaseMan
Оно делает! Чистая магия! Последнее, что мне нужно выяснить, это как преобразовать эти значения в переменные bash для дальнейшего использования в сценарии bash.
Я думаю, это будет новый вопрос @DatabaseMan. Для достижения может потребоваться другая логика. Пожалуйста, откройте новый вопрос, чтобы другие могли также внести свой вклад
Итак, что вы пробовали? На каких языках вы даже можете программировать? Пожалуйста, как новый пользователь, начните с тура и прочитайте Как спросить.