2015-02-06 3 views
0

Я ищу для создания сценария оболочки для чтения журнала сообщений и при обнаружении правильной строки выполнить действие. До сих пор у меня есть следующие:Прочитайте журнал unix для сообщения, а затем выполните действие

#!/bin/bash 
string="ntp engine ready" 
tail -n 0 -f /var/log/messages | \ 
while read LINE 
do 
echo "$LINE | grep -q $string" 
if [ $? == 0];then 
shttpclient "http://127.0.0.1/do/action" 
fi 
done 

Но, я получаю следующее сообщение об ошибке:

grep: engine: No such file or directory 
grep: ready: No such file or directory 

Даже когда я вижу регистратор имеет выводимый ntp engine ready.

ответ

1

Во-первых, вам нужно исправить ваши цитаты:

echo "$LINE" | grep -q "$string" 

Во-вторых, вы можете просто сделать:

if echo "$LINE" | grep -q "$string"; then 

, а не проверять код возврата $? вручную. Помните, что [ - это тоже команда, и if просто проверяет свой код возврата.

Если вам не нужно использовать [, помните, что ] является аргументом команды, поэтому важно, чтобы окружить его с пробелами:

if [ $? = 0 ] 

Я также удалили второй = как это баш для поддержки его. На самом деле вы делаете целое сравнение, поэтому на самом деле это должно быть одно из следующих действий:

if [ $? -eq 0 ] # POSIX compliant 
if (($? == 0)) # bash arithmetic context 
+0

благодаря, как я сказал, немного новичка даже в такой форме, спасибо за помощь –

+0

@Erik нет проблем, спасибо за принятие моего ответа. Я бы рекомендовал взять [тур], если вы еще этого не сделали, это не займет много времени и содержит информацию об этом. –

0

Alter строку следующим образом:

echo "$LINE" | grep -q "$string" 

Кавычки не были установлены правильно. Например, когда вы выполняете это: grep -q ntp engine ready; ntp - строка для поиска и engine и ready - это файлы. Он должен выглядеть так: grep -q "ntp engine ready".

Смежные вопросы