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