Я знаю, ты ждешь чего-то очень быстрого,и просто, как однострочная команда sed -или умный код awk, но если вам все равно...
#!/bin/bash
#Note: Adjusted to run with a posix shell (tested in dash)
filename='file'
newip='127.0.0.1'
hostchar='d'
tac "$filename" | while IFS= read -r line ; do
case $line in
host=${hostchar})
flag=on
;;
host=*)
flag=off
;;
esac
if [ "$flag" = "on" ]; then
case $line in
ip=*)
echo ip=$newip
continue
;;
#you can replace more variables at once by adding it here
#in the same standard.
#for ex: mask=*) echo mask=$newmask; continue ;; etc...
esac
fi
echo $line
done | tac
Результаты:
ip=x.x.x.a
mask=255.0.0.0
host=a
ip=x.x.x.b
mask=255.0.0.0
host=b
ip=x.x.x.c
mask=255.0.0.0
host=c
ip=127.0.0.1
blahblah
mask=255.0.0.0
host=d
Это может быть вызвано несколькими причинами, но, безусловно, наиболее распространенной является интегрированная графика, после чего система назначает блок оперативной памяти для GPU/APU.
Найдите в dmesg
карту памяти BIOS e820. Он покажет, какие куски оперативной памяти биос пометил зарезервированными для различных вещей, которые могут включать встроенную память графического чипа. Эта память вычитается из объема, доступного ядру. Часто материнские платы резервируют все от 3 до 4 ГБ для видеокарт и других устройств, а некоторые старые не имеют возможности перемещать туда оперативную память по более высоким адресам, что делает ее непригодной для использования. Или некоторые материнские платы могут иметь такую возможность, но их BIOS не может ее использовать. Поскольку вам не хватает ~2 ГБ ОЗУ, скорее всего, у вас просто очень плохой BIOS, и вам следует обратиться к производителю материнской платы за обновлением.