Intereting Posts
Хранить объекты html в базе данных? Или конвертировать при восстановлении? Экспорт таблицы HTML в PDF с ее форматом с помощью jsPDF Enterprise Architect 8> Отображение цепочки наследования для класса Как определить, что PHP-скрипт находится в фазе завершения? Сравнение массивов PHP с использованием ссылок на память Как установить REMOTE_ADDR в apache до вызова php Непосредственное добавление имени пользователя в URL-адрес PHP Инструмент для отладки и тестирования директив mod_rewrite (.htaccess) Как загрузить большой файл с использованием PHP (использование низкой памяти) Есть ли плагин PHP для разрешения входа через основные OpenIds и API входа? Как получить код для проверки правильности комбинации имени пользователя и пароля? Динамическая таблица HTML в PHP Mail Проблема различных версий PHP Изменить стек в Zend HeadScript View Helper mysql Выберите один столбец дважды из той же таблицы с разными датами в предложении where

PHP или Linux Shell: самый быстрый способ уменьшить текстовый файл с более чем 10 строками, чтобы иметь только последние 10 строк

Мне нужно знать самый быстрый способ в PHP или Linux Command Shell, чтобы уменьшить текстовый файл с более чем 10 строками, чтобы иметь только последние 10 строк. Я хочу использовать 10 строк для этого примера.

Благодаря 🙂

чтобы уменьшить файл до последнего, тогда строки сделают

 tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file 

объяснение:

tail выводит последние n строк файла. > записывает его в файл. && для цепочки команд. rm удаляет файл. mv переименовывает файл (или перемещается в другое место).

Если вы действительно не хотите генерировать новый файл, вы можете попробовать

 echo "$(tail -n 10 path/to/file)" >path/to/file 

$() Работает так же, как backticks (он оценивает все, что внутри, и приравнивается к выходу указанной команды), за исключением того, что он работает лучше в строках. На моей машине Linux строка оценивается (значение « tail запускается) перед выходом в файл (что вызывает проблемы с tail file >file открывается и усекается – как только команда начинается). Я думаю, это потому, что echo является встроенным, но не цитируйте меня.

EDIT: На самом деле, я посмотрел поближе. Это потому, что tail находится в строке. Существует несколько этапов: здесь мы нуждаемся в интерполяции, перенаправлении и выполнении, которые всегда происходят в определенном порядке (а именно, только что приведенном порядке). И в процессе интерполяции строки Bash должен запустить команду внутри нее. Перед выполнением любого перенаправления. С tail file >file прямого tail file >file tail программа – это то, что на самом деле генерирует вывод, поэтому выход не выполняется, пока команда не выполняется, но файл уже был открыт для записи (из-за перенаправления) прямо перед этим и открытия этого файла для записи усекает его.)

 phase tail file >file echo "$(tail file)" >file -------------+---------------------------------+------------------------------- interpolate nothing run "tail file"; get output (+) redirect open file for write; set stdout open file for write; set stdout execute run "tail file" (*) run 'echo "line\nline\n..."' 

(*) : Обратите внимание: поскольку file уже открыт для записи к этой точке, он теперь усечен. Так tail читает 0 байт.
(+) : Поскольку file был прочитан до того, как перенаправление открыло его для записи, tail удается просмотреть все данные.

Несмотря на то, что поведение явно определено и предсказуемо, это по-прежнему кажется мне ненадежным. Он полагается на bash arcana и может очень сильно вызвать проблемы с памятью, если вы пытаетесь получить слишком много или слишком длинные строки. (Я тестировал с ~ 500 строк символов и не видел никаких проблем. Но еще не тестировал более 10 строк.) Вероятно, лучше использовать временный файл, если вам не нужно сохранить тот же номер индексного дескриптора по какой-то нечетной причине.

 tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile 

Отредактировано, чтобы предоставить исключительно последние 10 строк файла с потенциально более чем 10 строками.

В Linux вы могли бы сделать

 tail -n 10 path/to/file > path/to/output/file 

Это займет последние десять строк (# строк, заданных по значению после -n) файла, а затем добавьте их в другой файл.

Если вы хотите переписать существующий файл только своими последними десятью строками,

 tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file 

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

Вы также можете сделать это на PHP, используя exec () с командой оболочки внутри, или более трудоемкий способ чтения всего файла в массив с файлом (), а затем взять последние десять элементов массива и добавить их обратно в файл с файлом fwrite () или аналогичным.