Как получить две строки из lshw?

10

Я хочу записать серийный номер материнской платы и модель продукта компьютера. я использовал

sudo lshw | grep -m1  serial:

выполнить поиск серийного номера (поскольку имеется многократное вхождение «serial:», а первое, что мне нужно, - это как сделать это и одновременно выполнить grep и для «product:»). Также существует несколько вхождений продукта, и первый снова тот, который я хочу.

lshw возвращает это:

user@ubuntu:~$ sudo lshw
ubuntu-pc              
    description: Notebook
    product: 23252DG (LENOVO_MT_2325)
    vendor: LENOVO
    version: ThinkPad X230
    serial: R9TWZVR
    width: 64 bits
    capabilities: smbios-2.7 dmi-2.7 vsyscall32
    configuration: administrator_password=disabled chassis=notebook family=ThinkPad X230 power-on_password=disabled sku=LENOVO_MT_2325 uuid=01ECC0B1-8251-CB11-8538-B7D9EC435D9B
  *-core
       description: Motherboard
       product: 23252DG
       vendor: LENOVO
       physical id: 0
       version: Not Defined
       serial: 1ZPAB2AC2C1
       slot: Not Available
     *-cpu
          description: CPU
          product: Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
          vendor: Intel Corp.
          physical id: 1
          bus info: cpu@0
          version: Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
          serial: None
shortyputting
источник

Ответы:

16

Вы хотите , чтобы первые две строки , которые соответствуют либо product:или serial:. Если это так, вы можете попробовать:

$ sudo lshw | grep -Em2 'serial:|product:'
    product: 20FWCTO1WW (LENOVO_MT_20FW_BU_Think_FM_ThinkPad T460p)
    serial: PF0P1EUH

В качестве альтернативы, grepвсе строки, которые соответствуют любой из целевых строк, а затем используют headдля печати только первые 2:

$ sudo lshw | grep -E 'serial:|product:' | head -n2
    product: 20FWCTO1WW (LENOVO_MT_20FW_BU_Think_FM_ThinkPad T460p)
    serial: PF0P1EUH

Конечно, оба эти подхода предполагают, что у вас никогда не будет секунды product:перед первым, serial:и наоборот.

Тердон
источник
15

Используйте lshwс переключателем --classили, -cчтобы показать только systemкласс, и вам не нужно беспокоиться об извлечении только 1-го вхождения:

lshw -c system | grep -E 'product:|serial:'

Если вы не хотите использовать, -c systemвы можете использовать sedи использовать qпри первом появлении serial:

lshw | sed '/serial/q;/product/!d'

Если вам нужны только те значения, которые вы могли бы использовать jq:

lshw -json -c system | jq '.product,.serial'

Предполагая, что вы запускаете эти команды как root.

don_crissti
источник
Приятно! Из любопытства, как ты умеешь пользоваться system? Я не вижу, чтобы это упоминалось в man lshw. Можем ли мы быть уверены, что -c systemвсегда будут показывать детали материнской платы и больше ничего?
тердон
1
@terdon - это в руководстве: если вы запустите lshw -short(чтобы увидеть аппаратные классы), вывод не
требует
1
Ах, так и есть, спасибо. Очевидно, я только прочитал первое предложение -cраздела в руководстве и пропустил второе, которое объясняло это точно. Вздох .
Тердон
3

Использование grepи -classопция:

sudo lshw -class system | grep 'product\|serial'
GAD3R
источник