Мониторинг журнала с помощью сценария оболочки

$ perl -0777 -pe '$s="item1"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' },
     'item3': { 'buy': 'bananna', 
                'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science'}})
Some other content in this file.

$ perl -0777 -pe '$s="item3"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' }})
Some other content in this file.

$ perl -0777 -pe '$s="item2"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item3': { 'buy': 'bananna', 
                'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science'}})
Some other content in this file.
  • Использует -0777 , чтобы удалить весь файл, и s флаг, чтобы разрешить . * для соответствие строкам
  • s / * \ x27 $ s \ x27: \ s * \ {. *? \}, \ n * // s для таких элементов, как item1 и item2 где , следует за }
  • s /, \ s * \ x27 $ s \ x27: \ s * \ {. *? \} (?!,) // s для таких элементов, как item3 , где, как я подозреваю, вам нужно удалить , в предыдущей строке
  • \ x27 шестнадцатеричный код для одинарных кавычек
  • просто заменить $ s = "item2"; на требуемый элемент, который необходимо удалить


Изменить:

Для передачи переменных из оболочки (см. этот вопрос и ответ на SO для подробностей)

$ export var1='item3'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' },
     'item2': { 'buy': 'apple', 'drink': x'cola',
                'work': 'slow', 
                'eat': 'sweet',
                'travel': 'world' }})
Some other content in this file.

Вы также можете удалить несколько элементов

$ export var1='(item3|item2)'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt 
some other content in this file
    demo({
     'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
                'work': 'hard', 
                'study': 'science' }})
Some other content in this file.
5
11.08.2015, 16:43
2 ответа

Одним из улучшений ответа , предоставленного @ glenn-jackman , будет использование опции -E для mailx. На странице руководства для mailx:

-E

Не отправлять сообщения с пустым телом. Это полезно при передаче ошибок из скриптов cron (8).

0
27.01.2020, 20:35

Более надежный способ справиться с этим - использовать инструмент, созданный для конкретного сценария, который вы задумали (то есть для отслеживания журнала и отправки электронных писем на вновь обнаруженные закономерности).

Загрузите этот инструмент.

Распаковав его и запустив, вы увидите множество реальных примеров, которые вы можете имитировать. Один из примеров, на котором вы хотите сосредоточиться, - это MODEL13, который решает задачу отправки уведомлений по электронной почте на определенные адреса электронной почты всякий раз, когда шаблон обнаруживается в одном или нескольких разных журналах.

./logrobot localhost /var/tmp/logXray autonda /var/log 60m '.*error.*_P_.*fatal.*' '.'  1 1 errchk -ndshow email=John.Blah@blah.com

В приведенной выше команде ниже приведены параметры, которые вы должны изменить по своему усмотрению:

  • '. * Error. * _ P _. * Fatal. *' - здесь выполняется поиск двух шаблонов во всех журналах в каталоге / var / log

  • / var / log - это каталог, журналы которого вы хотите отслеживать. Если вы хотите отслеживать конкретный файл журнала, замените его абсолютным путем к файлу журнала.

  • 1 - Отправить предупреждение, если в журнале (ах) обнаружена 1 запись
  • 1 - Отправить критическое предупреждение, если в журнале (ах) найдена 1 запись
    • Если предупреждение и критическое состояние совпадают, проверка будет предупреждать как критическое, когда отслеживаемый шаблон будет найден в журналах.
  • errchk - это тег для данной проверки журнала. Дайте этому достойное имя ... имя, соответствующее типу отслеживаемых журналов ... т.е. tomcatLogCheck
  • И, конечно же, адрес электронной почты =. Измените это на соответствующие адреса электронной почты.

Это лучший вариант, поскольку он включает необходимую логику, которая гарантирует, что будут сканироваться только новые строки, добавленные в отслеживаемый журнал (журналы). К тому же это намного эффективнее. И он также должен быть портативным.

Конечно, убедитесь, что на хосте установлен postfix, чтобы можно было отправлять электронные письма. Возможно, я что-то здесь забыл, но это должно быть сутью того, как работает инструмент.

0
27.01.2020, 20:35

Теги

Похожие вопросы