Entonces tengo un script bash que crea registros como este:
traceroute to -------, 30 hops max, 60 byte packets
1 router.Belkin (192.168.2.1) 2.275 ms 2.263 ms 2.249 ms
2 ------- 16.961 ms 21.060 ms 21.069 ms
3 ------- 21.025 ms 21.009 ms 20.996 ms
Me gustaría filtrar la parte ms y ver si alguna de ellas tiene más de 350 ms. Si es así, el archivo de registro completo se enviará a mi correo electrónico con el asunto "..." y el cuerpo "..." ¿Alguna ayuda?
¡Gracias!
Respuesta1
Aquí hay un guión. Proporcione el nombre del archivo de registro como primer argumento. Esto comprueba cualquier tiempo superior a 350 ms. Si se encuentra ese momento, envía un correo electrónico.
#!/bin/sh
logfile="$1"
flag="$(awk -v RS=" " '$1 == "ms" && last > 350 {flag=1} {last=$1} END{print flag}' "$logfile")"
[ "$flag" ] && mail you@host -s "Over 350ms Report for $logfile" <"$logfile"
Esto requiere que su sistema tenga el correo instalado y configurado correctamente.
Guión combinado
Lo anterior se puede combinar con el script enEl script no recorrerá los archivos como estaba previstocomo sigue:
#!/bin/sh
n=
while true
do
fname=~/"Scripts/logs/trace$n.log"
[ -f "$fname" ] || break
n=$(($n+1))
done
traceroute google.com >"$fname"
flag="$(awk -v RS=" " '$1 == "ms" && last > 350 {flag=1} {last=$1} END{print flag}' "$fname")"
[ "$flag" ] && mail you@host -s "Over 350ms Report for $fname" <"$fname"
Forma cooperativa
Supongamos que el guión enEl script no recorrerá los archivos como estaba previstose ejecuta por separado. Entonces, un posible script para inspeccionar los archivos creados por él para retrasos de >350 ms sería:
#!/bin/sh
for logfile in ~/Scripts/logs/trace*.log
do
flag="$(awk -v RS=" " '$1 == "ms" && last > 350 {flag=1} {last=$1} END{print flag}' "$logfile")"
[ "$flag" ] && mail you@host -s "Over 350ms Report for $logfile" <"$logfile"
done
Formulario cooperativo con mover y eliminar
#!/bin/sh
otherdir=~/"Scripts/logs-with-long-delays/"
for logfile in ~/Scripts/logs/trace*.log
do
flag="$(awk -v RS=" " '$1 == "ms" && last > 350 {flag=1} {last=$1} END{print flag}' "$logfile")"
if [ "$flag" ]
then
mail you@host -s "Over 350ms Report for $logfile" <"$logfile"
mv "$logfile" "$otherdir"
else
rm "$logfile"
fi
done