每当我输入Sudo apt-get remove
然后按下 Tab 自动完成的密钥我收到以下消息:
grep-status: /var/lib/dpkg/status:15945: expected a colon
.
我没有在状态文件中的第15945行看到任何特别奇怪的内容。它是单声道程序包的描述字段中的点字符,插入冒号没有帮助。删除包含点的行也不起作用。使用status-old覆盖文件会产生相同的消息。
有没有办法重建状态文件?
我终于修复了我的系统。恢复状态文件的备份不起作用,因为我有这么长时间的问题,它在我的所有备份中。
修复涉及到实际格式化中断的grepping并手动修复它们。它并不像听起来那么难。
您应该能够使用以前已知的良好状态文件并从那里进行更新。每次进行安装或更新时,状态文件都会保存到/ var/backups下的gzipped备份中。在目录上执行ls -l dpkg*显示:
-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root 624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root 623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root 620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root 619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root 619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root 618968 2010-09-21 08:33 dpkg.status.6.gz
还有一个名为status-old的/ var/lib/dpkg /目录中创建的文件的备份。在目录上执行ls -l status*显示:
-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old
因此,要从损坏中恢复,您应该能够执行以下操作:
1.备份损坏的状态文件:
mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup
2.将最近的dpkg状态文件从以上任一来源复制到位:
或者
cp /var/lib/dpkg/status-old /var/lib/dpkg/status
或
cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status
.然后运行apt-get update :
Sudo apt-get update
应该这样做。
尝试使用“dpkg -P”作为违规套餐。这将从本地存储库中清除它,删除所有跟踪。在我的系统上,这是产生该错误的已删除(但尚未清除)的软件包的修复程序。
我能够通过删除状态文件中已损坏条目的包来解决此问题。
Sudo dpkg -r handbrake-cli
通过pcregrep接受的解决方案不起作用(pcregrep没有找到任何东西)。
在这种情况下,我会备份损坏的/var/lib/dpkg/status
文件,然后使用以下信息手动更正(在1888和9550行)
apt-cache show libssl0.9.8
apt-cache show udev
这是一个错误(应该修复): Launchpad Bug 613018
这应该是一种解决方法(备份,“修复”版本字符串):
cp /var/lib/dpkg/status ~/dpkg-status.back
Sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
的儿子...
好吧,实际的错误是在15266线,尽管报告了大约700线进一步下降。状态文件中有问题的条目是由于我安装了deb以使我的Lexmark打印机很久以前工作。该条目用于包lexmark-inkjet-08-driver
。 Description字段在换行符处没有.
。这导致解析错误。
为了找到这个,我采用了猎枪故障排除方法,并开始随意尝试。我的一个愚蠢的尝试是grep-status -P e
,认为e是字母表中最常见的字母。愚蠢,我知道,但是在它抱怨冒号缺失之前打印出的最后状态记录是lexmark包,我注意到在几分钟的屏幕盯着后缺少.
字符。
如果可能的话,我想要另一个答案,可以描述一种更好的方法来找到这种问题,以防将来遇到类似的问题。谢谢。
因为我的状态旧即使使用apt-get update
也有问题,
这对我很有用:
(以root身份)
cd /var/lib/dpkg
cp -avf status status.corrupt
tr -cd '\11\12\15\40-\176' < status.corrupt > status
此命令使用tr命令的-c和-d参数从输入流中删除除单引号之间显示的ASCII八进制值之外的所有字符。此命令特别允许以下字符通过此Unix过滤器:
八进制11:选项卡
八进制12:换行
八进制15:回车
八进制40到八进制176:所有“好”的键盘字符
所有其他二进制字符 - 文件中的“垃圾”字符 - 在此转换过程中将被删除。
信用: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix
如果你很好奇发生了什么变化或损害在哪里:(可能很长)
diff /var/lib/dpkg/{status-old,status} |less