Как извлечь значение из вывода командной строки? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть функция, которая получает информацию обо всех USB-подключенных устройствах.

connected_devices = :os.cmd('usb-devices | grep -A 1 Product=')

Это дает мне 'S: Product=EHCI Host Controller\nS: SerialNumber=0000:00:3d.0\n--\nS: Product=HP Truevision HD\nS: SerialNumber=201001010001\n--\nS: Product=xHCI Host Controller\nS: SerialNumber=0000:00:16.0\n--\nS: Product=iPhone\nS: SerialNumber=1d19427ba66fd77d12a836593af57c21c993f0c9\n--\nS: Product=xHCI Host Controller\nS: SerialNumber=0000:00:16.0\n'

Из выходных данных вышеупомянутой функции я хочу извлечь значения Product и SerialNumber, чтобы я мог составить список объектов, таких как [{product: something, serial_number: some number} ...]

Как извлечь значение из вывода командной строки?

1 Ответ

0 голосов
/ 02 мая 2018

Сначала я бы разделил на --, чтобы каждый кусок содержал 1 продукт и 1 serial_number. Затем используйте регулярные выражения для извлечения соответствующих данных из каждого куска:

output = 'S:  Product=EHCI Host Controller\nS:  SerialNumber=0000:00:3d.0\n--\nS:  Product=HP Truevision HD\nS:  SerialNumber=201001010001\n--\nS:  Product=xHCI Host Controller\nS:  SerialNumber=0000:00:16.0\n--\nS:  Product=iPhone\nS:  SerialNumber=1d19427ba66fd77d12a836593af57c21c993f0c9\n--\nS:  Product=xHCI Host Controller\nS:  SerialNumber=0000:00:16.0\n'

output
|> List.to_string()
|> String.split("--")
|> Enum.map(fn chunk ->
  [_, product] = Regex.run(~r/Product=(.+)/, chunk)
  [_, serial_number] = Regex.run(~r/SerialNumber=(.+)/, chunk)
  %{product: product, serial_number: serial_number}
end)
|> IO.inspect

Выход:

[
  %{product: "EHCI Host Controller", serial_number: "0000:00:3d.0"},
  %{product: "HP Truevision HD", serial_number: "201001010001"},
  %{product: "xHCI Host Controller", serial_number: "0000:00:16.0"},
  %{
    product: "iPhone",
    serial_number: "1d19427ba66fd77d12a836593af57c21c993f0c9"
  },
  %{product: "xHCI Host Controller", serial_number: "0000:00:16.0"}
]
...