Всякий раз, когда я набираю sudo apt-get remove, а затем нажимаю клавишу Tab для автозавершения, я получаю следующее сообщение:
grep-status: /var/lib/dpkg/status:15945: expected a colon
.
Я не вижу ничего особо странного в строке 15945 в файле состояния , Это символ точки в поле описания пакета моно библиотеки, а вставка двоеточия не помогла. Удаление строки, содержащей точку, тоже не работало.
Есть ли способ перестроить файл состояния?
Можно ли переписать файл со статусом-старшим?Вы должны иметь возможность работать с предыдущим известным файлом состояния и обновлять оттуда. Каждый раз, когда вы выполняете установку или обновление, файл состояния сохраняется в резервной копии с копией в / var / backups. Выполнение 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
Существует также резервная копия файла, созданного в каталоге / var / lib / dpkg / с именем status-old. Выполнение / var / backups * в каталоге показывает:
-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
1. Сделайте резервную копию поврежденного файла состояния
либо
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
3. Затем запустите apt-get update:
sudo apt-get update
Это должно сделать это.
В этом случае я бы сделал резервную копию поврежденного файла /var/lib/dpkg/status, а затем исправил его вручную (вокруг строк 1888 и 9550), используя информацию из
apt-cache show libssl0.9.8
apt-cache show udev
Я смог исправить эту проблему, удалив пакеты, которые имели поврежденные записи в файле состояния.
sudo dpkg -r handbrake-cli
Принятое решение через pcregrep не работает (pcregrep ничего не нашел).
Попробуйте «dpkg -P» для повреждающего пакета. Это очистит его от локального хранилища, удалив все следы. В моей системе это было исправление для удаленных (но еще не очищенных) пакетов, которые вызвали эту ошибку.
Это ошибка (предполагается, что она исправлена): Launchpad Bug 613018
Upstream: Ошибка пусковой установки 613018
Это должно быть обходным путем ( backup, "fix"):
cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
Сын a ...
Хорошо, фактическая ошибка была в строке 15266, несмотря на то, что сообщалось о 700 линиях вниз. Проблематичная запись в файле состояния была вызвана установкой deb, которую я установил, чтобы мой принтер Lexmark работал давным-давно. Запись была для пакета lexmark-inkjet-08-driver. В поле описания не было места . вместо разрыва строки. Это вызвало ошибку синтаксического анализа.
Чтобы найти это, я прибег к методу устранения дробовика и начал очень часто пытаться. Одна из моих глупых попыток была grep-status -P e, считая, что e является самой распространенной буквой в алфавите. Dumb, я знаю, но последняя запись состояния, напечатанная до того, как она жаловалась на отсутствующий двоеточие, была для пакета lexmark, и я заметил отсутствие символа . после нескольких минут просмотра на экране.
Если возможно, я хотел бы получить еще один ответ, который мог бы описать лучший метод для поиска такой проблемы, если кто-то столкнется с подобной проблемой в будущем. Спасибо.
Поскольку мой статус-старый был слишком проблематичным даже с apt-get update,
Это работало довольно хорошо для меня:
(как root)
cd /var/lib/dpkg
cp -avf status status.corrupt
tr -cd '\11\12\15\40-\176' < status.corrupt > status
Эта команда использует команды -c и -d для команды tr, чтобы удалить все символы из входного потока, отличные от восьмизначных значений ASCII, которые показаны между одинарными кавычками. Эта команда специально позволяет пропускать следующие символы через этот фильтр Unix: восьмеричный 11: tab восьмеричный 12: linefeed восьмеричный 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