Wie grep ich zwei Zeilen von lshw?

10

Ich möchte die Seriennummer des Motherboards und das Produktmodell eines Computers ermitteln. ich benutzte

sudo lshw | grep -m1  serial:

um die Seriennummer zu erfassen (da es mehrere Vorkommen von "serial:" gibt und das von mir gewünschte das erste ist. Wie kann ich dies tun UND gleichzeitig auch nach "product:" suchen? Es gibt auch mehrere Vorkommen von Produkt, und der erste ist wieder der, den ich will.

lshw gibt dies zurück:

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
quelle

Antworten:

16

Sie möchten die ersten beiden Zeilen, die entweder product:oder übereinstimmen serial:. Wenn ja, können Sie versuchen:

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

Alternativ können grepalle Zeilen, die mit einer der Zielzeichenfolgen übereinstimmen und dann headnur die ersten beiden drucken:

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

Bei beiden Ansätzen wird natürlich davon ausgegangen, dass Sie nie eine Sekunde product:vor dem ersten haben serial:und umgekehrt.

terdon
quelle
15

Verwenden Sie lshwdie Option --classoder -c, um nur die systemKlasse anzuzeigen, und Sie müssen sich nicht darum kümmern, nur das erste Vorkommen zu extrahieren:

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

Wenn Sie nicht verwenden möchten, können -c systemSie verwenden sedund quit beim ersten Auftreten von serial:

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

Wenn Sie nur die Werte benötigen, die Sie verwenden können jq:

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

Angenommen, Sie führen diese Befehle als root aus.

don_crissti
quelle
Nett! Woher wussten Sie aus Neugier, was Sie verwenden sollten system? Ich sehe es nicht erwähnt in man lshw. Können wir sicher sein, dass -c systemimmer die Motherboard-Details angezeigt werden und sonst nichts?
Terdon
1
@terdon - es ist im Handbuch: Wenn Sie ausführen lshw -short(um die Hardware-Klassen zu sehen), ist die Ausgabe selbsterklärend
don_crissti
1
Ah, so ist es, danke. Anscheinend habe ich nur den ersten Satz des -cAbschnitts im Handbuch gelesen und den zweiten verpasst, der genau das erklärte. Seufz .
Terdon
3

Verwendung grepund -classOption:

sudo lshw -class system | grep 'product\|serial'
GAD3R
quelle