Вы можете использовать команду установки 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
Если 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"
Обычно я создаю большой двоичный объект с помощью 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
Я уверен, что это можно реорганизовать, но это даст вам желаемые результаты.
Вы можете искать 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