2009-07-08 6 views
2

Je suis en train d'écrire un script shell pour faire une "queue" sur un fichier journal en pleine croissance. Ce script accepte les paramètres à rechercher et greps incrémente la sortie sur eux.Création de chaînes grep dynamiquement

Par exemple, si le script est invoqué comme suit:

logs.sh string1 string2 

il devrait se traduire par:

tail -f logs.txt | grep string1 | grep string2 

Je construis la liste des chaînes de grep comme ceci:

full_grep_string="" 
for grep_string in $* 
do 
    full_grep_string="$full_grep_string | grep $grep_string" 
done 

La chaîne est construite correctement, mais quand j'essaye de l'étiqueter enfin à la commande de queue, comme si ...

tail -f $LOG_FILE_PATH $full_grep_string 

... le grep ne s'applique pas, et j'obtiens les bûches non filtrées.

Ai-je raté quelque chose ici? Ou y a-t-il un moyen plus facile de le faire?

+0

Juste une petite précision: l'idée que votre script devrait afficher les lignes du fichier journal qui contient à la fois string1 et string2, ou aviez-vous l'intention de trouver des lignes contenant l'une des chaînes? –

+0

En outre, quelle coque utilisez-vous? frapper? –

+0

pour moi sur Debian Lenny Je dois faire face au problème que deux grep combinés ne fonctionnent pas avec tail -f mais avec juste la queue – tuergeist

Répondre

2
eval tail -f $LOG_FILE_PATH $full_grep_string 
+0

Cela a fonctionné! Merci! :) –

1

grep met en mémoire tampon la ligne trouvée. Donc, la modification de votre code à

full_grep_string="$full_grep_string | grep --line-buffered $grep_string" 

doit fonctionner. Je l'ai testé sur Debian Lenny (avec bash).

Et utiliser la pointe de an0

eval tail -f ... 

(Tout cela fonctionne pour des mots entiers)

+0

Merci pour le conseil .. mais il semble que ma version de grep est trop ancienne pour prendre des arguments en plein mot. Je suis en train de tester sur une boîte SunOS 5.8, btw. Très vieux logiciel. :) –

Questions connexes