bash script para executar um segundo comando com a saída de seleção do primeiro comando como variável

0

Gostaria de obter a saída do segundo comando com o domínio PSI de 7 caracteres (00: 01.0) como uma variável. Como posso escrever um script para fazer isso?

jeff@jeff-probook:/$ lspci | grep VGA
    00:01.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Carrizo (rev c5)
jeff@jeff-probook:/$ lspci -v -s 00:01.0
00:01.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Carrizo (rev c5) (prog-if 00 [VGA controller])
    Subsystem: Hewlett-Packard Company Carrizo
    Flags: bus master, fast devsel, latency 0, IRQ 231
    Memory at c0000000 (64-bit, prefetchable) [size=256M]
    Memory at d0000000 (64-bit, prefetchable) [size=8M]
    I/O ports at 3000 [size=256]
    Memory at d0d00000 (32-bit, non-prefetchable) [size=256K]
    Expansion ROM at d0800000 [disabled] [size=128K]
    Capabilities: 
    Kernel driver in use: amdgpu
    Kernel modules: amdgpu

Isso definitivamente não está funcionando:

user@host:~$ cat lspciVGA
#!/bin/bash

var1="$(lspci | grep -E "VGA|3D")"
var2="$(expr substr ${var1} 0 7)"
var3="$(sudo lspci -v -s ${var2})"
echo "$var3"

Saída:

user@host:~$ bash lspciVGA
expr: syntax error
lspci: option requires an argument -- 's'
Usage: lspci []

Basic display modes:
-mm             Produce machine-readable output (single -m for an obsolete format)
-t              Show bus tree

Display options:
-v              Be verbose (-vv for very verbose)
-k              Show kernel drivers handling each device
-x              Show hex-dump of the standard part of the config space
-xxx            Show hex-dump of the whole config space (dangerous; root only)
-xxxx           Show hex-dump of the 4096-byte extended config space (root only)
-b              Bus-centric view (addresses and IRQ's as seen by the bus)
-D              Always show domain numbers

Resolving of device ID's to names:
-n              Show numeric ID's
-nn             Show both textual and numeric ID's (names & numbers)
-q              Query the PCI ID database for unknown ID's via DNS
-qq             As above, but re-query locally cached entries
-Q              Query the PCI ID database for all ID's via DNS

Selection of devices:
-s [[[[]:]]:][][.[]]   Show only devices in selected slots
-d []:[]                        Show only devices with specified ID's

Other options:
-i        Use specified ID database instead of /usr/share/misc/pci.ids.gz
-p        Look up kernel modules in a given file instead of default modules.pcimap
-M              Enable 'bus mapping' mode (dangerous; root only)

PCI access options:
-A      Use the specified PCI access method (see '-A help' for a list)
-O =  Set PCI access parameter (see '-O help' for a list)
-G              Enable PCI access debugging
-H        Use direct hardware access ( = 1 or 2)
-F        Read PCI configuration dump from a given file

Referência: link

    
por conman253 13.05.2016 / 22:07

2 respostas

1

existe um problema na atribuição de var2. Deveria ler:

var2=$(expr substr "${var1}" 1 7)

o motivo das aspas é que var1 tem espaços em branco que confundem substr e o 0 - > 1 é porque começa a contar a partir de 1.

Além disso, há alguns problemas com suas citações:

#!/bin/bash

var1=$(lspci | grep -E "VGA|3D")
var2=$(expr substr "${var1}" 1 7)
var3=$(sudo lspci -v -s "${var2}")
echo "$var3"
    
por user448115 13.05.2016 / 22:24
1

Usando grep com PCRE ( -P ):

lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)'

e

lspci -v -s 00:01.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
  • ^\s* corresponde a zero ou mais espaços em branco no início e \K descarta a correspondência, isso é para lidar com o segundo caso em que há espaços no início

  • \S+ corresponde a qualquer número de caracteres que não sejam espaços em branco, essa é a parte desejada

  • O padrão lookahead positivo de largura zero, (?=\s+VGA\s) , garante que a correspondência desejada seja flutuada em VGA após os espaços em branco após a parte desejada.

Para salvar a saída em uma variável, use a substituição de comando ( $() ):

value=$(lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)')

Da mesma forma:

value=$(lspci -v -s 00:01.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)')

Agora você pode obter o valor em $value .

Exemplo (no meu sistema):

$ lspci | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
00:02.0

$ lspci -v -s 00:02.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
00:02.0
    
por heemayl 13.05.2016 / 22:17