Como grep duas linhas de lshw?

10

Quero cumprimentar o número de série da placa-mãe e o modelo do produto de um computador. eu usei

sudo lshw | grep -m1  serial:

para grep o número de série (já que existem várias ocorrências de "serial:" e a que eu quero é a primeira. Como posso fazer isso E, simultaneamente, grep para "product:"? Também existem várias ocorrências de produto, e o primeiro é novamente o que eu quero.

lshw retorna isso:

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
fonte

Respostas:

16

Você deseja as duas primeiras linhas que correspondem a product:ou serial:. Nesse caso, você pode tentar:

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

Como alternativa, greptodas as linhas que correspondem a qualquer uma das sequências de destino e as usam headpara imprimir apenas as duas primeiras:

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

Obviamente, ambas as abordagens assumem que você nunca terá um segundo product:antes da primeira serial:e vice-versa.

terdon
fonte
15

Use lshwcom o botão --classou -cpara mostrar apenas a systemclasse e você não precisa se preocupar em extrair apenas a 1ª ocorrência:

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

Se você não quiser usar, -c systempoderá usar sede usar qna 1ª ocorrência de serial:

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

Se você precisar apenas dos valores, poderá usar jq:

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

Supondo que você esteja executando esses comandos como root.

don_crissti
fonte
Agradável! Por curiosidade, como você sabia usar system? Eu não vejo isso mencionado em man lshw. Podemos ter certeza de que -c systemsempre mostrará os detalhes da placa-mãe e nada mais?
terdon
1
@terdon - é no manual: se você executar lshw -short(para ver as classes de hardware), a saída é auto-explicativo
don_crissti
1
Ah, é verdade, obrigado. Aparentemente, só li a primeira frase da -cseção no manual e perdi a segunda, que explicava exatamente isso. Suspiro .
terdon
3

Usando grepe -classopção:

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