Я инициализирую переменную следующим образом:
dmesgDevs=$(dmesg | grep idVendor)
и хочу печатать ее построчно, а затем проверяю, есть ли слово в определенной строке.
dmesg | grep idVendor
, вывод будет организован в большее количество строк, но когда вы сделаете dmesgDevs=$(dmesg | grep idVendor)
, все строки будут объединены в одну строку.
Теперь, чтобы печатать dmesgDevs
построчно, вы можете установить переменную внутреннего разделителя полей (IFS), а затем разрешить ее анализ в массив. Примерно так он будет анализировать каждый раз, когда одна строка ввода разделяется [
:
while IFS='[' read ADDR; do for i in "${ADDR[@]}"; do echo $i; done; done <<< "$dmesgDevs"
Наконец, чтобы проверить, есть ли слово в определенной строке, просто перенаправьте вывод предыдущей команды на grep
:
while IFS='[' read ADDR; do for i in "${ADDR[@]}"; do echo $i; done; done <<< "$dmesgDevs" | grep 'word'
В этом случае мне удалось найти решение, потому что каждая строка начинается с одного и того же шаблона ([
), но это происходит не всегда. Таким образом, вместо этого, вместо того, чтобы сохранить вывод команды dmesg | grep idVendor
в переменной, сохраните его в файле; например, в /tmp/dmesgDevs
. Вы можете сделать это, используя:
dmesg | grep idVendor > /tmp/dmesgDevs
Тогда все очень просто:
cat /tmp/dmesgDevs
grep 'word' /tmp/dmesgDevs