Trouvez plusieurs chaînes dans un fichier et un e-mail lors de la survenue de toute chaîne définie

StackOverflow https://stackoverflow.com/questions/9024006

  •  14-11-2019
  •  | 
  •  

Question

Je veux écrire un script shell qui trouvera l'occasion de plusieurs chaînes comme "Erreurs | Avis | Avertissements" à partir d'un fichier journal donné, tel que / var / log / messages. Si une chaîne correspond, elle doit envoyer une notification de messagerie à l'ID de messagerie spécifié.

Je peux utiliser:

grep -i -E '^Errors|Notice|Warnings' /var/log/messages

Mais mon principal problème est que le fichier journal augmente toujours, et si je veux ajouter ce script dans Cron, comment puis-je enregistrer la ligne de fichiers ou le contenu que j'avais déjà vérifié lors de la dernière exécution de mon script?

Par exemple, si le fichier journal est de 100 lignes et que j'ai lu le fichier en utilisant CAT ou quelque chose de similaire, puis avant la deuxième exécution, le fichier devient 300 lignes, puis je veux maintenant lire du numéro de ligne 101 à 300.

Quelqu'un peut-il suggérer comment je peux enregistrer ceci?

Était-ce utile?

La solution

Vous pouvez utiliser le script suivant pour ce faire:

start=0

[[ -f last-processed ]] && start=$(<last-processed)

start=$((start+1))

tail +$start /var/log/messages | grep -i -E 'Errors|Notice|Warnings' &&\
wc -l /var/log/messages | awk '{print $1}' > last-processed

btw vous avez un problème dans votre regx, il devrait être 'Errors|Notice|Warnings' à la place de '^Errors|Notice|Warnings'

Autres conseils

La rotation de votre fichier journal pourrait être la meilleure solution.

Mais si vous voulez le fichier grep de line_first à line_last vous pouvez utiliser sed:

Par exemple, obtenez une ligne de 100 à 110 à partir du flux d'entrée:

$> line_first=100; line_last=110
$> seq 1 1000 | sed -n "${line_first},${line_last}p"
100
101
102
103
104
105
106
107
108
109
110
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top