3

Я получил огромный текстовый файл (файл журнала) в моем CentOS, который я хотел бы удалить верхнюю часть, возможно, пару тысяч строк в день. (Или, возможно, просто разделить на две части)

Я провел поиск по этому сайту и обнаружил, что большинство использует grep, sed для удаления строк, но выводит их в другой файл. Не уверен, возможно ли, что с помощью сценария оболочки (bash) я могу обновить файл на месте? вместо:

sed current file > new file
cp new file > current file

Спасибо!

5 ответов5

5

sed --in-place $filter $file

5

Нет простого способа удалить строки из начала файла!

Даже используя sed -i , вы создаете новый файл, как показано с помощью следующих команд (> это мое приглашение):

> echo "Helo World" > toto
> ls -i toto
147543 toto
> sed -i -e 's/Helo/Hello/' toto
> ls -i toto
147292 toto

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

Это важно, если ваш файл журнала открыт программой во время выполнения этой операции. Если это так, вы создадите новый файл, в то время как программа, содержащая этот файл, продолжит запись в старый файл. Чтобы показать это, давайте попробуем следующее:

for f in $(seq 1 100); do date; echo $f; sleep 1; done > file1&
ln file1 file2
sleep 5
sed -i -e '1,10d' file1
ls -l file1 file2
sleep 5
ls -l file1 file2

2-й ls покажет одинаковый размер для file1 и растущий размер для file2 . Если бы я не выполнил ln до выполнения sed , исходный файл продолжал бы расти, не будучи доступным через иерархию файловой системы. Это приведет к использованию пространства на диске, как показано df но не показано как du . Более подробную информацию можно найти здесь и здесь .

Ротация журналов - ваш друг здесь, но это не может быть сделано без помощи программы регистрации. Должен быть способ указать программе закрыть и снова открыть файл, чтобы новый файл использовался, но журнал, записанный после начала sed и конца повторного открытия файла, может быть потерян. Если вы не хотите терять журналы, вы можете сначала скопировать файл, попросить программу открыть файл, а затем изменить скопированный файл. Это то, что logrotate позволяет вам делать с минимальными сценариями.

Вы можете прочитать больше на эту тему здесь (apache 1.3), здесь (apache 2.4) и здесь (bind 9).

2

Вы можете использовать Vim в режиме Ex:

ex -sc '1d2000|x' file
  1. 1 переход на первую строку

  2. 2000 выберите 2000 строк

  3. d удалить

  4. x сохранить и закрыть

0

Установить задание cron, чтобы вращать журнал? Хм?

http://linuxcommand.org/man_pages/logrotate8.html

0

Я получил огромный текстовый файл (файл журнала) в моем CentOS, который я хотел бы удалить верхнюю часть

вы можете использовать tail для генерации нового файла, содержащего только последние N строк

tail -n logfile >newlogfile
zcat logfile > $(date +%Y%m%d)logfile.gz && mv -f newlogfile logfile 2>/dev/null

, наверное, пару тысяч строк каждый день. (Или, возможно, просто разделить на две части)

Вы можете получить количество строк в файле с помощью:

NUMLINES=$(awk 'END{print NR}' logfile)
#do some integer math and split with head and tail

Я провел поиск по этому сайту и обнаружил, что большинство использует grep, sed для удаления строк, но выводит их в другой файл. Не уверен, возможно ли, что с помощью сценария оболочки (bash) я могу обновить файл на месте? вместо:

да, вы можете использовать sed, чтобы удалить первые n строк

#remove the first 10 lines
sed -i '1,10d' logfile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .