Удалить последнюю строку файла gz

Ваш ifup , вероятно, не запускается, потому что у интерфейса уже есть IPv4-адрес, и он не может добавить его дважды. Он даже до линии IPv6 не дойдет. Если вы можете, вы должны отключить интерфейс, чтобы все адреса были удалены, а затем снова запустить его.

Однако настройку IPv6 следует производить по-другому:

auto eth1
iface eth1 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1

iface eth1 inet6 static
    address 2001:470:28:5b2::1
    netmask 64

Вы также можете добавить шлюз, если хотите.

PS: похоже, многие люди не знают, но вы также можете использовать сетевую маску 24 для IPv4. Вам не нужно указывать маску сети 255.255.255.0 .

1
09.07.2016, 02:33
2 ответа

Вы не можете изменить сжатый файл, не распаковав его.

По крайней мере, чтобы удалить весь текст после 499-й строки, вам придется распаковать первые 499 строк, чтобы найти, где заканчивается 499-я строка. Если вы хотите удалить последнюю строку, независимо от количества строк, вам нужно распаковать весь файл, чтобы определить, где начинается последняя строка.

Здесь нет короткого пути, потому что файл сжат. Кодировка символа зависит от всех предыдущих символов - основной принцип сжатия gzip заключается в использовании более коротких битовых последовательностей для последовательностей символов, которые встречались ранее, и немного более длинных битовых последовательностей для последовательностей символов, которые еще не встречались, что позволяет получить файл меньшего размера, когда последовательности символов повторяются. Невозможно определить, что конкретный символ является переводом строки, не изучив все предыдущие символы.

Ваша попытка, которая распаковывает файл, работает с распакованным потоком и повторно распаковывает в другой файл, находится на правильном пути. Вам просто нужна правильная команда для усечения файла: tail -500 сохраняет последние 500 строк, а это не то, что вам нужно. Используйте head -n 499, чтобы сохранить первые 499 строк, или head -n -1, чтобы удалить последнюю строку. Не все системы поддерживают отрицательный аргумент для head; если ваша не поддерживает, вы можете использовать sed '$d' вместо этого.

gunzip <"$file" | head -n -1 | gzip >"$file".tmp
mv -- "$file".tmp "$file"

Обратите внимание, что вы не можете напрямую записывать в файл: gunzip <"$file" | ... | gzip >"$file" начнет перезапись файла, пока gunzip все еще читает его. Команды в конвейере выполняются параллельно. Хотя можно избежать создания временного файла, это плохая идея, потому что любой способ сделать это приведет к усеченному файлу, если команда будет прервана, поэтому я не буду обсуждать, как это сделать.

Теоретически, можно было бы усечь gzipped-файл следующим образом:

  1. распаковать его в памяти, чтобы определить позицию, в которой вы хотите его усечь;
  2. усечь файл, чтобы удалить все данные после последнего символа для сохранения;
  3. перезаписать последние несколько байт, чтобы правильно закодировать последний символ;
  4. перезаписать несколько байт в начале, чтобы отразить новый размер файла.

Однако это невозможно сделать с помощью стандартных инструментов, для этого потребуется специальное программирование, и в случае прерывания файл останется недействительным.

6
27.01.2020, 23:11

Вы можете использовать zcat.

zcat <file> | head -n <lines>

Распаковывается только для потоковой передачи этих nстрок.

Дополнительная литература:http://www.thegeekstuff.com/2009/05/zcat-zless-zgrep-zdiff-zcmp-zmore-gzip-file-operations-on-the-compressed-files/

2
27.01.2020, 23:11

Теги

Похожие вопросы