Jak grep dwie linie z lshw?

10

Chcę grep numer seryjny płyty głównej i model produktu komputera. użyłem

sudo lshw | grep -m1  serial:

aby grepować numer seryjny (ponieważ istnieje wiele wystąpień „serial:”, a ten, którego chcę, jest pierwszy. Jak mogę to zrobić ORAZ jednocześnie grep dla „produktu:”? Istnieje również wiele wystąpień produktu, a pierwszy jest tym, którego chcę.

lshw zwraca to:

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
krótkowłosy
źródło

Odpowiedzi:

16

Chcesz, aby pierwsze dwie linie pasowały do ​​jednej product:lub serial:. Jeśli tak, możesz spróbować:

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

Alternatywnie, grepwszystkie wiersze, które pasują do jednego z ciągów docelowych, a następnie służą headdo drukowania tylko dwóch pierwszych:

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

Oczywiście, oba te podejścia zakładają, że nigdy nie będziesz miał sekundy product:przed pierwszym serial:i odwrotnie.

terdon
źródło
15

Stosowanie lshwz --classlub -cprzełącznika, aby pokazać tylko systemklasy i nie trzeba się martwić o wyodrębnianie tylko 1st wystąpienie:

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

Jeśli nie chcesz używać, -c systemmożesz użyć sedi korzystać qprzy pierwszym wystąpieniu serial:

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

Jeśli potrzebujesz tylko wartości, których możesz użyć jq:

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

Zakładając, że uruchamiasz te polecenia jako root.

don_crissti
źródło
Miły! Z ciekawości, skąd wiedziałeś, jak używać system? Nie widzę tego w man lshw. Czy możemy być pewni, że -c systemzawsze pokażą szczegóły płyty głównej i nic więcej?
terdon
1
@terdon - jest w instrukcji: jeśli uruchomisz lshw -short(aby zobaczyć klasy sprzętowe), wynik jest oczywisty
don_crissti
1
Ach, tak jest, dzięki. Najwyraźniej przeczytałem tylko pierwsze zdanie tego -cfragmentu instrukcji i przeoczyłem drugie, które dokładnie to wyjaśniło. Westchnienie .
terdon
3

Korzystanie grepi -classopcja:

sudo lshw -class system | grep 'product\|serial'
GAD3R
źródło