Pages : 1
#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
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 j'avais trouver une autre solution avec grep -c.
J'ai pu finir mon script !!
Merci
Hors ligne