最新升级破坏了我的系统,我正在尝试恢复上次升级。我用实时 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 或任何工具获取包的名称?
答案1
尝试以下命令,
awk ' { print $4 } ' upgradeddpkg > upgrade.txt
如果你不想要冒号,:
那么运行,
awk -F ':' ' { print $1 } ' upgrade.txt > upgrade1.txt
解释:
awk ' { print $4 } ' upgradeddpkg > upgrade.txt
在此,awk 从中获取输入 upgradeddpkg
并仅打印 $4(列号 4)。该输出被重定向到upgrade.txt
文件。因此 upgrade.txt 文件仅包含带有冒号的包名称。要删除冒号及其后续部分(后面),您必须运行第二条命令。默认情况下,awk 将空格视为分隔符。
awk -F ':' ' { print $1 } ' upgrade.txt > upgrade1.txt
分隔符冒号是手动设置的,awk 将冒号视为分隔符而不是空格。现在 awk 从 upgrade.txt 获取输入 (stdin) 并打印 (stdout) 列 1(冒号之前的部分)。最后,标准输出被重定向到upgrade1.txt
。现在它只包含包名称。
答案2
使用 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