Каким-то образом ваш / var / lib / dpkg / status
был поврежден.
Вы могли
Попытаться отредактировать файл и исправить его вручную.
Попробуйте это решение из http://www.debianhelp.co.uk/debianproblem.htm
Восстановить данные выбора пакета
Если
/ var / lib / dpkg / status
становится неработоспособным по любой причине, система Debian теряет данные о выборе пакета и сильно страдает. Найдите старый файл / var / lib / dpkg / status по адресу/ var / lib / dpkg / status-old
или/ var / backups / dpkg .status. *
.Хранение
/ var / backups /
в отдельном разделе может быть хорошей идеей, поскольку этот каталог содержит множество важных системных данных.Если старый файл
/ var / lib / dpkg / status
недоступен, вы все равно можете восстановить информацию из каталогов в/ usr / share / doc /
.# ls / usr / share / doc | \ grep -v [A – Z] | \ grep -v '^ texmf $' | \ grep -v '^ debian $' | \ awk '{print $ 1 "install"}' | \ dpkg --set-selections # dselect --expert # переустановите систему, при необходимости отмените выбор
$ sort -k 3,3r session.log | awk '!seen[$2]++ { print }'
9 u1 2018-08-12 pass
6 u4 2018-07-11 pass
2 u2 2018-06-15 pass
3 u3 2018-05-18 pass
(El { print }
se puede eliminar por completo, solo lo incluyo para mostrar lo que sucede. La acción predeterminada es imprimir todo el registro de entrada si la condición es verdadera.)
Esto ordena el archivo que tiene, por fechas decrecientes (la fecha más reciente primero ). El programa awk
lee los datos ordenados e imprime la primera entrada encontrada para cada usuario. La variable seen
es una matriz/hash asociativo que utiliza los nombres de usuario como claves. Si su valor es cero para un usuario, entonces ese usuario aún no ha sido visto, por lo que se imprime la línea del archivo.
Tu código con mis anotaciones:
# get list of unique usernames from log:
( awk {print} session.log | cut -f2 -d' ' | sort | uniq ) > store.txt
# shorter equivalent:
# cut -d ' ' -f2 <session.log | sort -u >store.txt
# loop over the usernames:
for line in $(cat "store.txt")
do
# get entries related to this user:
grep "$line" session.log > "$line.txt"
# echo the last entry:
echo $(sort -k3 "$line.txt" | awk 'END{print}')
# shorter equivalent of both of the above commands:
# awk -v user="$line" '$2 == user { print }' session.log | sort -k3,3 | tail -n 1
done
rm -f store.txt
Entonces, un enfoque alternativo basado en su ciclo de shell:
cut -d ' ' -f2 <session.log | sort -u |
while read username; do
awk -v user="$username" '$2 == user { print }' session.log | sort -k 3,3 | tail -n 1
done
Nuevamente, el { print }
puede quedar fuera del script awk
anterior.
Esto todavía ordena los subconjuntos del registro de sesión una vez para cada usuario, lo que es un desperdicio.
Pre -ordenar el registro por fechas decrecientes:
sort -k3,3r -o sorted.log session.log
cut -d ' ' -f2 <session.log | sort -u |
while read username; do
awk -v user="$username" '$2 == user { print; exit }' sorted.log
done
rm sorted.log
Esto todavía requiere que escaneemos el registro desde arriba una vez por usuario. La mejora natural es permitir que awk
realice un seguimiento de qué usuarios se han visto y qué usuarios no se han visto, lo que le da mi respuesta en la parte superior.