Итак, у меня есть bash-скрипт, который создает логи вроде этого:
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
Я хотел бы отфильтровать часть ms и посмотреть, есть ли среди них более 350 мс. Если есть, весь файл журнала будет отправлен на мою электронную почту с темой "..." и текстом "..." какая-нибудь помощь?
Спасибо!
решение1
Вот скрипт. Укажите имя файла журнала в качестве первого аргумента. Он проверяет любое время более 350 мс. Если такое время найдено, он отправляет электронное письмо.
#!/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"
Для этого необходимо, чтобы в вашей системе была правильно установлена и настроена почта.
Комбинированный сценарий
Вышеизложенное можно объединить со сценарием вСкрипт не будет проходить по файлам, как планировалосьследующее:
#!/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"
Кооперативная форма
Предположим, что сценарий вСкрипт не будет проходить по файлам, как планировалосьработает отдельно. Тогда возможный сценарий для проверки файлов, созданных им, на предмет задержек >350 мс будет следующим:
#!/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
Кооперативная форма с перемещением и удалением
#!/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