Войти

Показать полную графическую версию : [решено] Поиск в последних 15 строчках txt файла


maestro-ussr
28-11-2011, 18:33
Добрый день. Пишу небольшой мониторинг лог файлов. Нужна ваша помощь. Подскажите, как осуществить задумку.

Необходимо в последних 15 строчках *.txt файлов, искать определенные слова. Если в последних 15 строчках хоть одного из текстовых файлов нет ни одного из заданных слов, то выдавать сообщение "Тревога":)

Заранее благодарен.

Anonymоus
28-11-2011, 19:06
Изначально немного не так реализовал, как вы просили - всего на один файл. Теперь переделал на все файлы с нужным расширением в заданной директории.
Замените Word1-Word4 на нужные вам слова, ну и директорию с логами укажите.

@Echo Off
SetLocal EnableDelayedExpansion

Set LogDir=logs
Set LogExt=txt
Set NOfLastStrings=15

:: Получаем список логов
Set TAlert=false
For /F "tokens=*" %%F In ('Dir "%LogDir%\*.%LogExt%" /B /A-D') Do (
Set LogFile=%LogDir%\%%F
Call :Check
)
:: Действия, если не найдено ни одного из слов во всех логах
If %TAlert%==true (
Echo.
Echo ALERT
)
Pause
Exit

:Check
:: Получаем общее количество строк
Set s=0
For /F %%A In (%LogFile%) Do (Set /A s+=1)

:: Убираем начальные строки, оставляем только заданное количество в конце
:: Ищем в строках заданные слова, если не нашлось ни одного - сообщаем
Set /A s-=NOfLastStrings
Set Alert=true
For /F "tokens=* skip=%s%" %%A In (%LogFile%) Do (
Echo %%A|Find "Word1">nul&&Set Alert=false
Echo %%A|Find "Word2">nul&&Set Alert=false
Echo %%A|Find "Word3">nul&&Set Alert=false
Echo %%A|Find "Word4">nul&&Set Alert=false
)

:: Действия, если не найдено ни одного из слов в последних строках
If %Alert%==true (
Echo %LogFile% - Warning
Set TAlert=true
) Else (
Echo %LogFile% - OK
)
Exit /B

maestro-ussr
28-11-2011, 19:46
Просто гигантское вам спасибо!
Очень помогли!

Anonymоus
29-11-2011, 21:00
Исправил по просьбе maestro-ussr, теперь скрипт работает корректно и с логами, содержащими символ перенаправления. Для работы нужен grep из пакета gnuwin32 в директории bin рядом со скриптом, его можно взять во вложении.


@Echo Off
:: Добавляем директорию с бинарниками в Path на время работы скрипта
Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin
SetLocal EnableDelayedExpansion

:: Настройки
:: Директория с логами
Set LogDir=logs
:: Расширение логфайлов
Set LogExt=txt
:: Сколько последних строк обрабатывать
Set NOfLastStrings=15
:: Ключевые слова, через запятую
Set Words=resultset,xmlacclist,datasource,version,keyword

:: Получаем список логов
Set TAlert=false
For /F "tokens=*" %%F In ('Dir "%LogDir%\*.%LogExt%" /B /A-D') Do (
Set LogFile=%LogDir%\%%F
Set DisplayedName=%LogDir%\%%F
Call :Check
)

:: Действия, если не найдено ни одного из слов во всех логах
If %TAlert%==true (
Echo.
Echo ALERT
)
Pause
Exit /B 1

::Проверка на длину файла
:Check
Set s=0
For /F %%A In (%LogFile%) Do (Set /A s+=1)
Set /A Skipped=!s!-%NOfLastStrings%
If !s! GTR %NOfLastStrings% (
For /F "tokens=* skip=%SKipped%" %%S In (%LogFile%) Do (
::Вынужденная мера, строки со знаками перенаправления grep'у не передать по конвейеру
Echo %%S>>tmpfile
)
Set LogFile=tmpfile
GoTo Finder
) Else (
GoTo Finder
)
Exit /B

:: Ищем вхождения заданных слов в цикле
:Finder
Set Data=%Words%
Set Alert=true
:FinderLoop
For /F "tokens=1,* delims=," %%A In ("!Data!") Do (
If Not "%%A"=="" (
Grep -o "%%A" %LogFile%>nul&&Set Alert=false
Set Data=%%B
GoTo FinderLoop
)
)
If Exist tmpfile Del tmpfile
:: Действия, если не найдено ни одного из слов в последних строках
If %Alert%==true (
Echo %DisplayedName% - Warning
Set TAlert=true
) Else (
Echo %DisplayedName% - OK
)
Exit /B




© OSzone.net 2001-2012