Я использую следующий скрипт bash, чтобы удалить все, кроме последних 'x' строк в файле журнала:

#!/bin/bash
# Script to  write to the log file every minute  and delete all but the last 
# set time in hours

echo `date +\%Y\%m\%d\%H\%M\%S`,`/home/pi/temp/temp` >> /home/pi/temp/temp.log

HOURS="12"                      #Nr of hours in the log
LINES=$(( $HOURS * 60 + 1 ))    #Nr of minutes/lines in the log

echo $LINES                     #Included just for testing if i'm getting the desired amount of lines

sed -e :a -e '$q;N;$LINES,$D;ba' temp.log >temp1.log ;mv temp1.log  temp.log

Я заменил значение $ LINES (12 часов) на 721, и скрипт работает как задача cron, запускается каждую минуту без ошибок, поэтому я уверен, что ошибка в той части, которая включает переменную в sed.

Кроме того, я просто скопировал это с какого-то веб-сайта, если кто-то может быть достаточно любезен, чтобы объяснить мне, что происходит в команде sed, возможно, я смог бы сам разобраться в ошибке.

Это ошибка:

sed: -e expression #2, char 8: extra characters after command.

Кроме того, он удаляет все строки в файле.

2 ответа2

3

Я знаю, что это не тот ответ, который вы хотели получить, поскольку он не относится к sed, но вы можете использовать tail же, как вы хотите, просто выполнив:

tail -n <lines> <file> > <new_file>

mv new_file file

1

Вы должны взять переменные из одинарных кавычек:

sed -e :a -e '$q;N;'"$LINES"',$D;ba' 

Другие заметки:

  • Избавьтесь от привычки использовать имена переменных ALL_CAPS. Однажды вы напишите PATH =/tmp, а затем удивитесь, почему ваш скрипт не работает.
  • % не является специальным символом для оболочки, вам не нужно экранировать его: date +%Y%m%d%H%M%S
  • используйте $(...) вместо обратных кавычек: легче видеть и легче вкладывать.
  • СЭД может редактировать файл на месте, вам не нужно писать временный файл и mv его:

    sed -i -e :a -e '$q;N;'"$LINES"',$D;ba' 
    
  • это очень похоже на этот ответ на стек-поток, который хорошо документирован. Прочитайте это для понимания.

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