сценарий удара для выполнения второй команды с избранным выводом от первой команды как переменная

Я хотел бы получить вывод второй команды с 7 доменами символа PSI (00:01.0) как переменная. Как я могу записать сценарий удара, чтобы сделать это?

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

Это определенно не работает:

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"

Вывод:

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

Ссылка: https://stackoverflow.com/questions/8928224/trying-to-retrieve-first-5-characters-from-string-in-bash-error

0
задан 23 May 2017 в 15:39

2 ответа

существует проблема в присвоении var2. Это должно читать:

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

причина кавычек состоит в том, что var1 имеет пробелы, которые путают substr, и 0-> 1 - то, потому что он начинает рассчитывать от 1.

Также существуют некоторые проблемы с Вашими кавычками:

#!/bin/bash

var1=$(lspci | grep -E "VGA|3D")
var2=$(expr substr "${var1}" 1 7)
var3=$(sudo lspci -v -s "${var2}")
echo "$var3"
0
ответ дан 24 May 2017 в 01:39
  • 1
    Я нашел, что включение сканера непосредственно в USB-порт вместо через концентратор решило многие проблемы, но я могу все еще can' t сканируют несколько страниц. – Lolwhites 17 May 2018 в 03:55

Используя grep с PCRE (-P):

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

и

lspci -v -s 00:01.0 | grep -Po '^\s*\K\S+(?=\s+VGA\s)'
  • ^\s* нуль соответствий или больше пробелов в запуске и \K отбрасывания соответствие, это должно заняться вторым случаем, где существуют пробелы в запуске

  • \S+ соответствия любое количество непробельных символов, это - наша желаемая часть

  • нулевая ширина, положительный предварительный шаблон, (?=\s+VGA\s), гарантирует, что желаемое соответствие течется [1 111] после пробелов после желаемой части.

<час>

Для сохранения вывода в переменной используйте замену команды ($()):

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

Так же:

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

Теперь можно получить значение [1 113].

<час>

Пример (в моей системе):

$ 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
0
ответ дан 24 May 2017 в 01:39
  • 1
    Сканер теперь обнаруживается и Xsane и Simple Scan. Однако, когда я пытаюсь на самом деле просканировать, Xsane возвращает сообщение " Отказавшие tro запускают сканер: Ошибка во время устройства I/O" в то время как Простое Сканирование говорит " Не удалось запустить scan". выполнение в терминале не предоставляет информации. – Lolwhites 9 May 2018 в 08:15

Другие вопросы по тегам:

Похожие вопросы: