Bash: добавить переменную из функции к выводу grep - PullRequest
0 голосов
/ 22 января 2019

Все, я использую следующий код для поиска термина в последних строках файла журнала, чтобы отправить код ошибки (найденная строка).Поскольку строка (код ошибки) не показывает, где она была найдена, я добавил ОПЕРАЦИЮ после того, как это выполнено в виде текста.

if tail -5 *logfile* | grep '*term*'; then
tail -5 *logfile* | grep '*term*' |  perl -ne 'print "OPERATION: $_"' | sendxmpp ...
fi

Но как я могу преобразовать это в функцию с предоставлением ОПЕРАЦИИ в качестве переменной(1 $)?Потому что я очень часто использую это в сценарии.

#!/bin/sh
check_log () 
{
if tail -5 *logfile* | grep '*term*'; then
tail -5 *logfile* | grep '*term*' |  perl -ne 'print "$1: $_"' | sendxmpp ...
fi
}
check_log OPERATION

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Во-первых, я подозреваю, что ваш if должен использовать флаг -q на grep.(Если бы не канал для sendxmpp, я бы тоже не стал беспокоиться о if.)

Во-вторых, я не уверен насчет регулярного выражения, которое вы передаете в grep.Это выглядит подозрительно с восклицательными знаками.

В-третьих, я ожидаю, что это лучше сделать в sed:

tail -5 *logfile* | grep '...' | sed -e 's/^/'"$1"': /' | sendxmpp ...

Обратите внимание, что тот же трюк с цитатами можно использовать и с Perl.Двойные кавычки могут быть лишними, если в параметре никогда не бывает пробелов или чего-то подобного.

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

0 голосов
/ 22 января 2019

Смотри ниже. Вы можете передать переменную оболочки ($1) в perl как именованную переменную (prefix), на которую затем сможете ссылаться в своей программе.

#!/bin/sh
check_log () {
    if tail -5 *logfile* | grep '*term*'; then
        tail -5 *logfile* | grep '*term*' |  perl -sne 'print "$prefix: $_"' -- -prefix=$1 | sendxmpp ...
    fi
}
check_log OPERATION

Обратите внимание, что я сделал 3 изменения в вашей команде perl:

  1. Добавление s в качестве опции. Это позволяет обрабатывать переключатели после содержимого программы.

  2. Двойная черта -- завершает обработку опций. Это говорит Perl, что в командной строке следует указать , а не параметр Perl.

  3. -prefix=$1 создает переменную Perl с именем prefix, значением которой является расширенное значение первого аргумента, переданного функции оболочкой ($1).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...