Script Bash: utilizzare la variabile in sed per eliminare tutte le righe tranne "x" di un file


0

Sto usando il seguente script bash per eliminare tutte le righe tranne "x" in un file di registro:

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

Ho sostituito $ LINES per il suo valore (12 ore), 721 e lo script funziona come cron task, viene eseguito ogni minuto, senza errori, quindi sono sicuro che l'errore si trova nella parte che include la variabile in sed.

Inoltre, l'ho appena copiato da qualche sito Web, se qualcuno potesse essere abbastanza gentile da spiegarmi cosa sta succedendo nel comando sed, forse sarei in grado di capire da solo l'errore.

Questo è l'errore:

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

Inoltre, elimina tutte le righe nel file.


Non è chiaro quale sia il tuo problema? Cosa non funziona esattamente? Qual è il risultato della tua sceneggiatura che non è come previsto?
ap0,

appena modificato per includere l'errore, scusate ho dimenticato di pubblicarlo prima
Antero Duarte,

Risposte:


1

Devi prendere le variabili tra virgolette singole:

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

Altre note:

  • Prendi l'abitudine di usare i nomi delle variabili ALL_CAPS. Un giorno scriverai PATH = / tmp e poi ti chiederai perché il tuo script è rotto.
  • % non è un personaggio speciale per la shell, non è necessario scappare: date +%Y%m%d%H%M%S
  • utilizzare al $(...)posto dei backtick: più facile da vedere e molto più facile da annidare.
  • sed può modificare un file sul posto, non è necessario scrivere in un file temporaneo e mvquesto:

    sed -i -e :a -e '$q;N;'"$LINES"',$D;ba' 
  • questo è molto simile a questa risposta StackOverflow ben documentata. Leggi per approfondimento.


Grazie, ci proverò;) per quanto riguarda la capsula, l'ho fatto semplicemente perché ho visto online su una guida per principianti di scripting bash, se non fosse stato per quella guida non l'avrei usato, ma lo cambierò, grazie :) PS: Inoltre, sulla modifica di un file in atto, quindi ho appena messo il nome file dopo il comando sed e lo modificherò in posizione? come sed -i -e: a -e '$ q; N;' "$ LINES" ', $ D; ba' temp.log?
Antero Duarte,

giusto. .
Glenn Jackman,

3

So che questa non è la risposta che volevi dal momento che non si riferisce a sed ma puoi usare tailcome vuoi, semplicemente:

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

mv new_file file


sì, grazie, lo so, sto solo usando sed perché ho letto da qualche parte che la coda è più lenta ... comunque, se uso la coda, come posso includere la variabile nelle righe? fai solo $ LINES?
Antero Duarte,

Sì, lo farebbe.
Isacco,

continuerò a sed per ora, dato che devo modificare il file effettivo invece di doverne creare uno nuovo e modificarlo con il nome del primo file funzionante :)
Antero Duarte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.