Script de bash: Use a variável in sed para excluir todas as últimas linhas "x" de um arquivo, exceto as últimas

0

Estou usando o seguinte script para excluir todas as últimas linhas 'x' em um arquivo de log:

#!/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

Eu substitui o $ LINES por seu valor (12 horas), 721 e o script está funcionando como uma tarefa Cron, executado a cada minuto, sem erros, então eu tenho certeza que o erro está na parte que inclui a variável em o sed.

Além disso, eu apenas copiei isso de algum site, se alguém puder ser gentil o suficiente para me explicar o que está acontecendo no comando sed, talvez eu consiga descobrir o erro sozinho.

Este é o erro:

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

Além disso, exclui todas as linhas do arquivo.

    
por Antero Duarte 26.09.2014 / 11:00

2 respostas

1

Você precisa tirar as variáveis das citações simples:

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

Outras notas:

  • Saia do hábito de usar nomes de variáveis ALL_CAPS. Um dia você escreverá PATH = / tmp e depois se perguntará por que seu script está quebrado.
  • % não é um caractere especial para o shell, você não precisa escapar: date +%Y%m%d%H%M%S
  • use $(...) em vez de backticks: mais fácil de ver e mais fácil de aninhar.
  • sed pode editar um arquivo no local, você não precisa gravar em um arquivo temporário e mv it:

    sed -i -e :a -e '$q;N;'"$LINES"',$D;ba' 
    
  • isto é muito semelhante a esta resposta stackoverflow está bem documentada. Leia isso para uma visão.

por 26.09.2014 / 12:18
3

Eu sei que esta não é a resposta que você queria, pois não se refere ao sed, mas você pode usar tail da mesma forma que deseja, apenas fazendo:

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

mv new_file file

    
por 26.09.2014 / 12:30