Как проверить наличие строки перед другой строкой на отдельных строках в файле

Вы можете использовать команду установки DKMS (Ссылка: man dkms ), чтобы перестроить и установить модуль для конкретного ядра. Ниже приведен пример, созданный путем удаления модулей виртуального бокса для одной версии ядра.

sudo dkms install <имя-модуля> / <версия-модуля> -k <версия-ядра>

$ dkms status
vboxhost, 5.0.10, 4.2.0-21-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-22-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-23-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-25-generic, x86_64: installed

$ sudo dkms remove vboxhost/5.0.10 -k 4.2.0-22-generic
...

$ dkms status
vboxhost, 5.0.10, 4.2.0-21-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-23-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-25-generic, x86_64: installed


$ sudo dkms install vboxhost/5.0.10 -k 4.2.0-22-generic

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=4.2.0-22-generic -C /lib/modules/4.2.0-22-generic/build M=/var/lib/dkms/vboxhost/5.0.10/build...............
cleaning build area....

DKMS: build completed.

vboxdrv.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.2.0-22-generic/updates/dkms/

vboxnetflt.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.2.0-22-generic/updates/dkms/

vboxnetadp.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.2.0-22-generic/updates/dkms/

vboxpci.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.2.0-22-generic/updates/dkms/

depmod....

DKMS: install completed.

$ dkms status
vboxhost, 5.0.10, 4.2.0-21-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-22-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-23-generic, x86_64: installed
vboxhost, 5.0.10, 4.2.0-25-generic, x86_64: installed
0
26.10.2018, 15:33
3 ответа

Если awkявляется опцией:

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file

Пояснение:

  • BEGIN{o=d=1}:инициализировать переменные
  • /\[old\]/{o=0}если найдено[old]:установитьo=0
  • /device: 1000/&&o==1{d=0;exit}:если device: 1000найден, а [old]еще не найден, установите d=0и перейдите к блоку END{}без дальнейшего изучения файла.
  • END{exit d}:выйти с заданным значениемd

Запустить так:

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file && echo "contains" || echo "contains not"
0
28.01.2020, 02:31

Обычно я создаю большой двоичный объект с помощью sed, записывая несколько строк в переменную. Это позволяет провести проверку позже, если требуемое условие выполнено.

blob=“$(sed -n “/^abc.*$/,/^$/p” file)”

Теперь у нас есть верхняя часть файла, назначенная на ”${blob}”.

Теперь мы просто условно проверяем ${blob}из [old]существует:

sh if [ $(grep -c “^\[old/]$” file) -gt 0 ]; then echo “${blob}” | grep “^device” | grep -c 1000 fi

Я уверен, что это можно реорганизовать, но это даст вам желаемые результаты.

0
28.01.2020, 02:31

Вы можете искать device: 1000после удаления всего после[old]:

if sed '/^\[old\]/q' < file | grep -q 'device: 1000'; then
  echo OK
fi

С GNU sed(, который вы, кажется, используете, учитывая особенности GNU -0,/.../в вашем подходе ).

if sed -n '/device: 1000/q; /^\[old\]/Q1' < file; then
  echo OK
fi

(q, стандартная форма Q0завершается со статусом выхода 0 (успех ), в то время как Q1завершается со статусом выхода 1 (не -ноль, поэтому не успех )).

В стандартном sedвы не можете изменить статус выхода sed, но можете полагаться на то, выводит ли он что-нибудь:

if [ -n "$(sed -n '/^\[old\]/q;/device: 1000/!d;=;q' < file)" ]; then
  echo OK
fi

(где =выводит номер строки, в которой встречается первое вхождение device: 1000).

Или вы можете использовать awk, который может установить переносимый статус выхода:

if awk '$0 == "[old]" {exit 1}; /device: 1000/ {exit 0}' < file; then
  echo OK
fi
0
28.01.2020, 02:31

Теги

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