2009-11-19 9 views
5

Wenn Sie eine wachsende Protokolldatei mit z. "less -iS + F service.log" Ich möchte , um die Anzeige auf Zeilen zu beschränken, die einem bestimmten Muster entsprechen.Filterfunktion für weniger + F

habe ich versucht, so etwas wie

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

, die nicht funktioniert. Auch

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

tut nicht was ich will. Es sieht so aus, als wäre die Eingabe bereits geschlossen und weniger zeigt keine Änderungen.

Wie kann ich die Anzeige auf Zeilen beschränken, die einem bestimmten Muster entsprechen?

Antwort

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

Dank für das Nachdenken meine Frage wenn dies nicht genau das, was ich will. Ich möchte "weniger" Funktionalität haben, d. H. Scrollen, Suchen, Hightlighting innerhalb der resultierenden Ausgabe. Etwas wie "tail -f service.log | grep | less + F" was leider nicht tut. – axelrose

0

Die Lösung schien einfach

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

aber weniger keine neue Linien von der wachsenden Log-Datei zu lesen, nicht fortgesetzt werden.

1

Wenn Sie nicht ein paar Prozesse jede Zeile Laichen und Abbauen dagegen haben, verwenden Sie einen Lese while-Schleife

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

Ich habe noch nicht ausgearbeitet, wie dies ohne eine temporäre Datei zu tun, aber Hier ist ein Skript, das eine funktionierende grep-gefilterte less +F (die seine temporäre Datei bereinigt) zeigt. Ich nenne es lessf.

Eines der Schlüsselelemente ist das --line-buffered Argument grep die tail Ausgang ermöglicht weiterhin durch die Rohrleitung zu fließen (die unbuffer Befehl zur Verfügung gestellt von expect bietet ähnliche Funktionalität für jedes Programm).

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

Beispiel Nutzung:

lessf /var/log/system.log foobar

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