Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
13 / 13 / 5
Регистрация: 06.04.2016
Сообщений: 180
1

Получить список версий ядер, установленных в системе

21.05.2016, 15:24. Показов 1001. Ответов 12
Метки нет (Все метки)

Здравствуйте, друзья! Изобретаю велосипед с квадратными колесами, а заодно постигаю великий Sed. Хочу получить список версий ядер, установленных в системе:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
$ dpkg -l linux-{headers,image}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | grep -o '[0-9].*[0-9]'
4.2.0-27
4.2.0-27
4.2.0-35
4.2.0-35
4.2.0-36
4.2.0-36
4.2.0-27
4.2.0-35
4.2.0-36
4.2.0-27
4.2.0-35
4.2.0-36
Так работает, однако присутствие grep очень смущает. Мои попытки продолжить повествование в sed упираются в конфликт "жадных" жадностей. Пишу так:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
$ dpkg -l linux-{headers,image}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;s/^.*\([0-9].*[0-9]\).*/\1/'
27
27
35
35
36
36
27
35
36
27
35
36
Есть возможность в этом случае исключить grep?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2016, 15:24
Ответы с готовыми решениями:

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя...

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя...

Получить список установленных программ
Как?

Получить список установленных приложений
Как получить список установленных приложений? Нашел в гугле много, но ни один вариант не работает!...

12
73 / 73 / 17
Регистрация: 06.05.2016
Сообщений: 413
21.05.2016, 16:36 2
Bash
1
dpkg -l | sed -n '/ii  linux-image/s/.*linux-image-//p' | sed  's/\s.*//'
с учетом того, что headers != kernel
Хочу попросить модератора написать, если можно, как это сделать без перенаправления.
Еще просьба: как сдеалать инвертирование 'ii linux-image' в написанной мною строке.
Ниасилил давно и прочно.

Добавлено через 22 минуты
По второй заявке - асинило после того, как написал.
Но, возможно, будет интересно еще кому-нибудь.
0
volodin661
21.05.2016, 19:29
  #3

Не по теме:

Цитата Сообщение от kalsarikannit Посмотреть сообщение
Хочу попросить модератора написать
модератора?

это как попросить бокового арбитра забить гол финнам,
раз уж овечкин не может.

0
73 / 73 / 17
Регистрация: 06.05.2016
Сообщений: 413
21.05.2016, 19:40 4
Цитата Сообщение от volodin661 Посмотреть сообщение

Не по теме:



модератора?

это как попросить бокового арбитра забить гол финнам,
раз уж овечкин не может.

Он, без сомнений, знает.
's/модератора/знающего/'
Буду благодарен.
0
Модератор
Эксперт NIX
2783 / 2031 / 680
Регистрация: 02.03.2015
Сообщений: 6,513
23.05.2016, 20:59 5
Цитата Сообщение от kalsarikannit Посмотреть сообщение
как сдеалать инвертирование 'ii linux-image' в написанной мною строке.
Ещё бы объяснили, что именно Вы имеете ввиду…
Мне нравится sed, только лишний он…
Bash
1
apt list --installed 'linux-[ih]*' 2>/dev/null | cut -d' ' -f2
0
73 / 73 / 17
Регистрация: 06.05.2016
Сообщений: 413
24.05.2016, 05:48 6
С инвертированием я разобрался:
Bash
1
2
seq 104 116 | sed -n '/105/!s/0/Патриарх наградил Зюганова/p' | sed 's/\s.*//'
seq 104 116 | sed -n '/105/s/0/Третьяк наградил Ротенберга/p' | sed 's/\s.*//'
Пытался объединить две команды sed в одну.
Не могу:
Bash
1
dpkg -l | sed -n '/ii  linux-image/s/.*linux-image-//;s/\s.*//p'
Могу:
Bash
1
seq 104 116 | sed -n '/105/s/0/Третьяк наградил Ротенберга /;s/\s.*//p'
Где ошибка?

Добавлено через 17 минут
Где ошибка? В каком месте головы? Вижу, всё работает как положено.
Вижу, что в dpkg -l выборка по <ii...blablabla> отрабатывает не так, как
хочу. Как сделать? t_go_to знаю, просто на сегодня зла не хватило. И
есть подозрение, что без этого можно обойтись.
0
Модератор
Эксперт NIX
2783 / 2031 / 680
Регистрация: 02.03.2015
Сообщений: 6,513
24.05.2016, 08:55 7
Ах, это! Можно поправить Ваш вариант
Bash
1
dpkg -l | sed -n '/ii  linux-image/{s/.*linux-image-//;s/\s.*//p}'
Но сделано не очень — два раза надо искать. Упростим
Bash
1
dpkg -l | sed -n '/ii\s\+linux-image-/{s///;s/\s.*//p}'
Можно через 1 команду
Bash
1
dpkg -l | sed -n 's/ii\s\+linux-image-\(\S\+\).*/\1/p'
Однако оптимальным мне видится
Bash
1
dpkg -l | sed -n '/ii  linux-image-/{s///;s/\s/\n/;P}'
1
13 / 13 / 5
Регистрация: 06.04.2016
Сообщений: 180
25.05.2016, 22:00  [ТС] 8
Спасибо за ответы! Правда это не совсем то, о чем спрашивал. В первом посте возникло затруднение с заменой строки на подстроку \1. По этой причине заканчивать приходится при помощи grep, не получается его исключить.

PS. headers тоже нужны, будем эти пакеты удалять.
0
Модератор
Эксперт NIX
2783 / 2031 / 680
Регистрация: 02.03.2015
Сообщений: 6,513
25.05.2016, 22:54 9
Цитата Сообщение от IlyaLinux Посмотреть сообщение
это не совсем то, о чем спрашивал
Чем именно предложенные варианты не подошли?
0
13 / 13 / 5
Регистрация: 06.04.2016
Сообщений: 180
25.05.2016, 23:08  [ТС] 10
Цитата Сообщение от Marinero Посмотреть сообщение
Чем именно предложенные варианты не подошли?
Вот что выдает команда из первого поста:
Bash
1
2
3
4
5
6
7
8
9
10
11
$ dpkg -l linux-{headers,image}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | grep -o '[0-9].*[0-9]'
4.2.0-27
4.2.0-27
4.2.0-35
4.2.0-35
4.2.0-36
4.2.0-36
4.2.0-35
4.2.0-36
4.2.0-35
4.2.0-36
Вот что выдает оптимальный вариант из вашего поста:
Bash
1
2
3
4
5
6
$ dpkg -l | sed -n '/ii  linux-image-/{s///;s/\s/\n/;P}'
4.2.0-35-generic
4.2.0-36-generic
extra-4.2.0-35-generic
extra-4.2.0-36-generic
generic-lts-wily
Видим, что списки различны. Меня grep смущает, убрать его хочется.
0
73 / 73 / 17
Регистрация: 06.05.2016
Сообщений: 413
26.05.2016, 04:19 11
Bash
1
2
3
dpkg -l  linux-{head,imag}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | grep -o '[0-9].*[0-9]'
dpkg -l  linux-{head,imag}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | sed 's/^[^0-9]*\([0-9].*[0-9]\).*/\1/'
dpkg -l  linux-{head,imag}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;s/^[^0-9]*\([0-9].*[0-9]\).*/\1/'
Добавлено через 1 час 37 минут
Еще одна попытка:
Bash
1
2
dpkg -l  linux-{head,imag}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | sed '/[0-9]/!d;s/^[^0-9]*\([0-9].*[0-9]\).*/\1/'
dpkg -l  linux-{head,imag}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;/[0-9]/!d;s/^[^0-9]*\([0-9].*[0-9]\).*/\1/'
Иначе у меня "generic-lts-wily" не фильтруется.
1
Модератор
Эксперт NIX
2783 / 2031 / 680
Регистрация: 02.03.2015
Сообщений: 6,513
26.05.2016, 09:10 12
Лучший ответ Сообщение было отмечено IlyaLinux как решение

Решение

Не сходите с ума. «Мой оптимальный» был иллюстрацией к вопросу
Цитата Сообщение от kalsarikannit Посмотреть сообщение
Пытался объединить две команды sed в одну
Я имею ввиду чем не устраивает
Цитата Сообщение от Marinero Посмотреть сообщение
Мне нравится sed, только лишний он…
Bash
1
apt list --installed 'linux-[ih]*' 2>/dev/null | cut -d' ' -f2
Хотя если в целях изучения… Попробуйте
Bash
1
dpkg -l | sed -n '/ii  linux-\(image\|headers\)[-a-z]*/{s///;s/[-a-z]*\s/\n/;P}'
Bash
1
dpkg --get-selections linux-[ih]* | grep -Po '[0-9][0-9.-]+(?=(-[a-z]+)?\s+install)'
Добавлено через 12 минут
Bash
1
dpkg -l linux-{head,imag}* 2>/dev/null | sed -rn '/^ii/s/[^0-9]+-([0-9.-]+[0-9]).*/\1/p'
1
13 / 13 / 5
Регистрация: 06.04.2016
Сообщений: 180
26.05.2016, 20:37  [ТС] 13
Когда ехал в транспорте в голову пришло аналогичное решение, однако, kalsarikannit,, вы меня опередили. Так просто сначала идет НЕ цифра. Вариант
Bash
1
2
3
4
5
6
7
8
9
10
11
$ dpkg -l linux-{headers,image}* | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;s/[^0-9]*\([0-9].*[0-9]\).*/\1/;'
4.2.0-27
4.2.0-27
4.2.0-35
4.2.0-35
4.2.0-36
4.2.0-36
4.2.0-35
4.2.0-36
4.2.0-35
4.2.0-36
признается рабочим.

Marinero, достигнуть вашей глубины понимания будет крайне сложно. Вариант
Bash
1
2
3
4
5
6
7
8
9
10
11
$ dpkg -l linux-{head,imag}* 2>/dev/null | sed -rn '/^ii/s/[^0-9]+-([0-9.-]+[0-9]).*/\1/p'
4.2.0-27
4.2.0-27
4.2.0-35
4.2.0-35
4.2.0-36
4.2.0-36
4.2.0-35
4.2.0-36
4.2.0-35
4.2.0-36
напоминает бриллиант тончайшей работы, так лаконично. Буду вникать в него и другие варианты решений.

Всем большое спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2016, 20:37

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как получить список установленных программ?
Как получить список установленных программ на компьютере ?

Как получить список установленных программ на компьютере?
Есть программа CCleaner, если зайти в раздел инструменты/ удаление, то там весь список программ для...

Как получить список всех установленных программ?
Доброго времени суток. Не подскажите как можно получить список всех установленных программ в...

Получить список принтеров, установленных на удалённом компьютере
Здравствуйте. Нужно вывести на экран список установленных принтеров с удалённого компьютера,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.