Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/03/2015, à 11:06

Sylvainremi

[Résolu] Résultat de grep

J'essaie de crée un script pour trouver une erreur (exemple datebaseError) dans les  logs de différents répertoires et envoyer par mail le nombre d'erreur et quel database est concernée

#!/bin/bash
LIGNES=1500
final=""
date="1 hours ago"

for i in `ls /var/lib | grep -E "^database..?$"` # (exemple databaseA ; databaseB etc)
do
resu=`find /var/lib/$i/logs -type f -newermt "$date" -exec tail -n $LIGNES {} \; | grep -e databaseError` #trouve les erreurs databaseerror dans n'importe quelle database
echo "$resu"
err=`echo "$resu" | wc -l` #compte le nombre d'erreur
echo "$err"
done
...

Mon problème est que le grep me renvoie des lignes vide
Ainsi si j'ai var/lib/databaseA/logs , var/lib/databaseB/logs  ,var/lib/databaseC/logs avec 9 erreurs dans la databaseA et aucunes dans les autres il me renvoie ceci:
Exemple de ce que renvoie $resu :

2015-02-20 10:11:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
2015-02-20 10:47:53 databaseError
(ligne vide correspondant a aucun résultât dans database B)
(ligne vide correspondant a aucun résultât dans database C)

je voudrais que les lignes vides disparaissent mais je ne trouve pas qu'elle option utiliser avec grep car le wc -l compte les lignes vides et me renvoie donc des faux positifs...

Dernière modification par Sylvainremi (Le 12/03/2015, à 10:06)

Hors ligne

#2 Le 11/03/2015, à 11:57

pingouinux

Re : [Résolu] Résultat de grep

Bonjour,
Est-ce que ceci conviendrait ?

for i in /var/lib/database?/logs
do
   resu=$(grep databaseError < <(tail -n $LIGNES "$i"))
   [ "$resu" ] && { echo "$resu"; wc -l <<<"$resu"; }
done

Hors ligne

#3 Le 11/03/2015, à 16:39

Sylvainremi

Re : [Résolu] Résultat de grep

Merci pour ta proposition , mais non car pour ce que je veux faire je dois récupérer la ligne avec l'erreur le nombre d'erreur et le nom de la database
Je reprends mon exemple j'ai 3 logs pour 3 différentes database (databaseA databaseB datebaseC) seule la database A contient 9 databasError
Je lance mon script

LIGNES=1500
final=""
date="6 days ago"

for i in `ls /usr/local | grep -E "^database..?$"` #exemple databaseA, databaseAB databaseXX
do
resu=`find /usr/local/$i/logs -type f -newermt "$date" -exec tail -n $LIGNES {} \; | grep -e databaseError`
resu2=`echo "$resu" | wc -l`
done
if [ $resu2 -gt 0 ]
then final="$final$i error $resu2 $resu"
echo "$final"
fi

et mon resultat de final est : DatabaseC error 1 alors qu'il n'y a pas d'erreur.. Je sais que le problème viens entre mon resu et resu2
resu renvoi des résultats pour chaque logs de database si il ne trouve pas l'erreur il renvoie une ligne vide et le wc -l compte cette ligne...
J'arrive pas être très claire...

Dernière modification par Sylvainremi (Le 11/03/2015, à 16:44)

Hors ligne

#4 Le 11/03/2015, à 17:22

pingouinux

Re : [Résolu] Résultat de grep

Le mieux serait que tu montres un exemple du résultat tel que tu le veux.

Hors ligne

#5 Le 11/03/2015, à 18:03

miniSeb

Re : [Résolu] Résultat de grep

S'il s'agit d'un problème de lignes vides, peut-être qu'en remplaçant

resu2=`echo "$resu" | wc -l`

par

resu2=`echo "$resu" | grep -v "^$" | wc -l`

ça devrait te convenir...

grep -v "^$" ne matche que les lignes non vides wink

Hors ligne

#6 Le 11/03/2015, à 19:24

quaego

Re : [Résolu] Résultat de grep

Pour le grep -v, variante plus tolérante :

grep -v "^[[:blank:]]*$"

Qui supprime les lignes vides, ou ne contenant que des espaces et/ou tabulations.

-v pour inverser le résultat, "^" début de ligne, "[[:blank:]]*" un nombre quelconque d'espaces/tabulations, "$" fin de ligne.

Hors ligne

#7 Le 12/03/2015, à 10:06

Sylvainremi

Re : [Résolu] Résultat de grep

J'ai bien tester vaut proposition, elles fonctionnent smile j'avais trouver une autre solution avec grep -c.
J'ai pu finir mon script !!

Merci

Hors ligne