2009-11-19 7 views
5

Lorsque vous regardez un fichier journal croissant avec, par ex. "less -iS + F service.log" Je veux pour limiter l'affichage aux lignes correspondant à un certain motif.Fonction de filtre pour moins + F

J'ai essayé quelque chose comme

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

qui ne fonctionne pas. Aussi

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

ne fait pas ce que je veux. Il semble que l'entrée est déjà fermée et moins n'affiche pas les modifications. Comment puis-je limiter l'affichage aux lignes correspondant à un certain modèle?

Répondre

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

Merci pour réfléchir à ma question si ce n'est pas exactement ce que je veux. Je veux avoir une fonctionnalité "inférieure", c'est-à-dire faire défiler, rechercher, éclairer dans la sortie résultante. Quelque chose comme "tail -f service.log | grep | less + F" qui malheureusement ne le fait pas. – axelrose

0

La solution semblait simplement

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

mais moins ne continue pas à lire les nouvelles lignes du fichier journal de plus en plus.

1

Si vous ne me dérange pas la reproduction et démolissant quelques processus chaque ligne, utilisez une lecture en boucle

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

Je n'ai pas encore trouvé comment faire cela sans un fichier temporaire, mais Voici un script qui montre un grep -filtered less +F (qui nettoie son fichier temporaire). Je l'appelle lessf.

L'un des principaux éléments est l'argument --line-buffered-grep qui permet tail sortie de continuer à circuler à travers le pipeline (unbuffer la commande fournie par expect fournit une fonctionnalité similaire pour tout programme).

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

Exemple d'utilisation:

lessf /var/log/system.log foobar

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

Questions connexes