2009-11-19 5 views
5

Quando si guarda un file di registro crescente con ad es. "less -iS + F service.log" Voglio per limitare la visualizzazione alle linee che corrispondono a un determinato modello.Funzione filtro per meno + F

ho provato qualcosa di simile

less +F service.log | grep <pattern> | less +F 

che non funziona. Anche

cat < service.log | grep <pattern> | less +F 

non fa quello che voglio. Sembra che l'input sia già chiuso e che less non mostri le modifiche.

Come è possibile limitare la visualizzazione a linee che corrispondono a un determinato motivo?

risposta

0
tail -f service.log | grep <pattern> 
+0

Grazie per riflettere la mia domanda se questo non è esattamente quello che voglio. Desidero avere una funzionalità "inferiore", ovvero scorrere, cercare, evidenziare all'interno dell'output risultante. Qualcosa come "tail -f service.log | grep | less + F" che sfortunatamente non lo fa. – axelrose

0

La soluzione sembrava semplicemente

LESSOPEN='|grep <pattern> %s' less +F service.log 

ma meno non continuare a leggere nuove linee dal file di registro in crescita.

1

Se non ti dispiace la deposizione delle uova e abbattere un paio di processi di ogni riga, utilizzare una lettura while

tail -f filename.log|while read line; do echo $line | grep pattern; done 
1

non ho ancora trovato il modo di fare questo senza un file temporaneo, ma ecco uno script che dimostra un funzionale grep -filtro less +F (che pulisce il suo file temporaneo). Lo chiamo lessf.

Uno degli elementi chiave è la --line-buffered argomento grep che permette tail uscita di continuare a fluire attraverso la tubazione (la unbuffer comando fornito da expect fornisce funzionalità simili per qualsiasi programma).

#!/bin/sh 
LOGFILE=$1 
shift 
[email protected] 
TEMP_DIR=/tmp/lesstmp 
TEMP_FILE="$TEMP_DIR/$(basename $LOGFILE)" 
[ ! -d $TEMP_DIR ] && mkdir $TEMP_DIR 
trap 'rm -rf "$TEMP_DIR"; exit' INT TERM EXIT 
(tail -f "$LOGFILE" | grep --line-buffered $PATTERN) > "$TEMP_FILE" | less +F "$TEMP_FILE" 
trap - INT TERM EXIT 

Esempio di utilizzo:

lessf /var/log/system.log foobar

lessf /var/log/system.log -v nobar