Intereting Posts
Обновление Linux mint 17 32-бит для Linux mint 17 64-бит Имя хоста на терминале изменяется при подключении Интернета: почему? Система не запрашивает моего согласия при использовании sudo несколько раз Синхронизация Pi с локальным каталогом Почему sh отображает ошибку, если bash не работает? Как я могу использовать тройник для печати входного потока? Проблемы с отображением пользователей NFSv4 Не удалось запустить sshd во время загрузки на centos 6.4. Он начинается ТОЛЬКО после входа в систему с консоли Почему используется && в 75 раз быстрее, чем если … fi и как сделать код более понятным awk scripting для сканирования файлов для определенных слов и создания вывода Должен ли я записывать ошибки вверх по течению, моим менеджерам распространения или тому и другому? Раздельные монтажные перегородки? Установить локально с помощью dnf в Fedora без использования подключения к Интернету Нет такого устройства или адреса NFS больше не монтируется: rpc-statd не запускается

Как объединить переключатели -v и -B в grep?

У меня есть список установленных ядер, и я пытаюсь вытеснить как установленное ядро, так и ранее установленное ядро. В этом примере linux-image-3.2.0-60-generic – это текущее ядро, и это установленные ядра:

linux-image-3.2.0-49-generic linux-image-3.2.0-51-generic linux-image-3.2.0-52-generic linux-image-3.2.0-53-generic linux-image-3.2.0-54-generic linux-image-3.2.0-55-generic linux-image-3.2.0-56-generic linux-image-3.2.0-57-generic linux-image-3.2.0-58-generic linux-image-3.2.0-59-generic linux-image-3.2.0-60-generic linux-image-3.2.0-61-generic linux-image-3.2.0-63-generic linux-image-3.2.0-64-generic 

Я могу использовать grep -v $(uname -r) чтобы удалить текущее ядро ​​из этого списка. Однако я не могу использовать grep -v -B 1 $(uname -r) чтобы удалить текущее и предыдущее ядро ​​из списка. Есть ли способ объединить -B и -v ? Или я приближаюсь к этому целиком из неправильного направления?

Вы можете использовать 2 grep, чтобы получить то, что хотите. Внутренний grep будет генерировать «список» совпадений для текущего ядра, uname -r и предыдущее обращение к нему. Внешний grep даст вам список ядер, за исключением этих 2.

 $ grep -v "$(grep -B 1 "$(uname -r)" list.txt)" list.txt 

пример

Чтобы имитировать то, что у вас есть, я добавил их содержимое в файл list.txt .

 $ cat list.txt linux-image-3.2.0-49-generic linux-image-3.2.0-51-generic linux-image-3.2.0-52-generic linux-image-3.2.0-53-generic linux-image-3.2.0-54-generic linux-image-3.2.0-55-generic linux-image-3.2.0-56-generic linux-image-3.2.0-57-generic linux-image-3.2.0-58-generic linux-image-3.2.0-59-generic linux-image-3.2.0-60-generic linux-image-3.2.0-61-generic linux-image-3.2.0-63-generic linux-image-3.2.0-64-generic 

Теперь давайте притворимся, что команда uname -r возвращает эту строку:

 $ uname -r 3.2.0-60-generic 

Поэтому, когда я запускаю эту команду, я получаю список ядер минус uname -r и предыдущую версию.

 $ grep -v "$(grep -B 1 "3.2.0-60-generic" list.txt)" list.txt linux-image-3.2.0-49-generic linux-image-3.2.0-51-generic linux-image-3.2.0-52-generic linux-image-3.2.0-53-generic linux-image-3.2.0-54-generic linux-image-3.2.0-55-generic linux-image-3.2.0-56-generic linux-image-3.2.0-57-generic linux-image-3.2.0-58-generic linux-image-3.2.0-61-generic linux-image-3.2.0-63-generic linux-image-3.2.0-64-generic 

Все это предполагает, что список ядер в list.txt находится в отсортированном формате.

Дополнительные советы

Если вам интересно, я написал A для этого Q & A под названием: Как программно определить установленную RPM с максимальной версией ядра? где я покажу, как вы можете анализировать версии ядер с помощью sort -V .

Как вы упомянули список, я предполагаю, что это в каком-то файле. Тем не менее, команда может быть легко изменена.

Более простой подход состоял бы в том,

 current_ver=$(uname -r) awk "/$current_ver/{y=1;next}y" list 

В переменной current_ver хранится текущая версия ядра. Команда awk получает результат после текущей версии.

PS:

Я не очень хорошо разбираюсь в awk . Команда может быть дополнительно улучшена 🙂

Поскольку мы определенно работаем с linux здесь, вы можете использовать GNU ls для результатов сортировки vversion. Учитывая это и ваши имена файлов ядра вряд ли будут содержать какие-то странные символы, которые вы могли бы сделать:

 ls -1v /boot/linux-image* | grep "$(uname -r)" -B1