Возвратите idVendor, idProduct и конечные точки через lsusb

Я хочу вернуть только некоторые данные моего любимого принтера. (Имя всегда содержит 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, которую я просто не смог освоить.

Спасибо за любую помощь заранее!

Поиск решений для извлечения строки, содержащей описание принтера, с помощью регулярного выражения.

Итак, что вы пробовали? На каких языках вы даже можете программировать? Пожалуйста, как новый пользователь, начните с тура и прочитайте Как спросить.

Ulrich Eckhardt 20.11.2022 21:28

Предлагаю посмотреть awk.

Cyrus 20.11.2022 21:56
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
2
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предлагаю следующий 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"... Есть еще идеи?

DatabaseMan 21.11.2022 11:17

Ответ решить поставленный вопрос. Пожалуйста, создайте новый вопрос. Укажите образец ввода, образец вывода и вашу попытку.

Dudi Boy 21.11.2022 16:50
Ответ принят как подходящий

Использование 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"... Есть еще идеи?

DatabaseMan 21.11.2022 11:17

Это работает? 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

HatLess 21.11.2022 11:31

Оно делает! Чистая магия! Последнее, что мне нужно выяснить, это как преобразовать эти значения в переменные bash для дальнейшего использования в сценарии bash.

DatabaseMan 21.11.2022 13:44

Я думаю, это будет новый вопрос @DatabaseMan. Для достижения может потребоваться другая логика. Пожалуйста, откройте новый вопрос, чтобы другие могли также внести свой вклад

HatLess 21.11.2022 14:31

Другие вопросы по теме