Последнее обновление остановило мою систему, и я пытаюсь отменить последнее обновление. Я открыл свой комп с живым USB и привязал к разделу, на котором установлена ОС. Я получаю обновленные пакеты с
cat /var/log/dpkg.log | grep upgrade >>upgradeddpkg
. В нем перечислены пакеты, например,
2014-03-14 15:31:45 upgrade libprocps0:i386 1:3.3.3-2ubuntu5.3 1:3.3.3-3
2014-03-14 15:31:52 upgrade libreadline-dev:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:31:53 upgrade libreadline6-dev:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:31:55 upgrade readline-common:all 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:32:25 upgrade libreadline6:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:32:33 upgrade libudev0:i386 175-0ubuntu19 175-7.2
2014-03-14 15:32:40 upgrade libdevmapper-dev:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:42 upgrade libdevmapper-event1.02.1:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:43 upgrade libdevmapper1.02.1:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:44 upgrade dmsetup:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
. Как я могу получить только название пакетов с помощью grep, awk или любого другого инструмента?
Попробуйте ниже команды,
awk ' { print $4 } ' upgradeddpkg > upgrade.txt
, Если Вы не хотите двоеточие :
тогда выполненный,
awk -F ':' ' { print $1 } ' upgrade.txt > upgrade1.txt
awk ' { print $4 } ' upgradeddpkg > upgrade.txt
В этом, awk берет вход от upgradeddpkg
и печатает только 4$ (номер столбца 4).That, вывод был перенаправлен к upgrade.txt
файл. Таким образом, файл upgrade.txt содержит только имена пакета с двоеточием. Для удаления двоеточия и его предстоящей части (после) необходимо выполнить вторую команду. По умолчанию awk рассматривает пространство как разделитель.
awk -F ':' ' { print $1 } ' upgrade.txt > upgrade1.txt
двоеточие Разделителя было вручную установлено, и awk рассматривает двоеточие как разделитель вместо пространства. Теперь awk берет вход (stdin) из upgrade.txt и печатает (stdout), coloumn1 (часть перед двоеточием).Finally стандартный вывод был перенаправлен к upgrade1.txt
.Now, это содержит только имена пакета.
Существует проблема с помощью grep для начального поиска, в который она включает вещи как ubuntu-release-upgrader-core:all
. Я использовал бы сингл awk
соответствовать и выбрать правую сторону поля.
awk '$3=="upgrade" { print $4 }' /var/log/dpkg.log
По умолчанию awk разделяет каждую строку на основе пробелов. Третье поле является действием (таким образом, мы проверяем, что оно равняется "обновлению"), и четвертым является имя пакета.
Некоторые пакеты обновлены много, таким образом, можно отключить шум дубликатов с:
awk '$3=="upgrade" { print $4 }' /var/log/dpkg.log | sort -u
Я видел ответ Avinash теперь... Я был бы немного осторожен из отрезания от архитектуры... В зависимости от того, что Вы делаете, они могли быть столь же релевантными как имя пакета... Но если бы Вы действительно хотели отрезать их, то я, вероятно, сделал бы это в том же awk
оператор:
awk '$3=="upgrade" { split($4, a, ":"); print a[1] }' /var/log/dpkg.log | sort -u
С другой стороны, Вы могли установить несколько разделителей полей для awk
, так, чтобы это разделило или на пробелах или на двоеточиях:
awk -F'[ :]' '$5=="upgrade" { print $6 }' /var/log/dpkg.log