Как сравнить любую строку из вывода через скрипт оболочки команды unix

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

Я пытался с cat logfilename | grep "un-clean". Но я не знаю, как проверить этот вывод в сценарии оболочки.

Я хочу что-то вроде (примерно) var= clean then the output of above command == var if yes then echo "ok" else re-run command

Я пробовал некоторые из команд, но не работает для меня.

2
задан 20 July 2016 в 03:57

2 ответа

В основном Вы хотите эту структуру

if grep -q "un-clean"  /path/to/log_file.log ;
then
    # put some command in case we find result is unclean
else 
    # if the output is ok, do something else
fi

Все, что это делает, к тихо (не печатая для экранирования) проверка, если существует соответствие строки, "грязной" в файле. Если существует, мы делаем, если часть, иначе - мы действительно еще отделяемся.

Вот пример:

$> if grep -q 'root' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi    
This user exists
$> if grep -q 'NOEXIST' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi 
This user doesn't exist

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

$> echo "HelloWorld"   &                                                                                      
[1] 6876

Добавление & причины echo "HelloWorld" выполненный в фоне, и мы имеем, это - PID, сохраненный в $! переменная. Таким образом мы можем сделать что-то как,

some-command  &
CMD_PID=$!
if grep -q "un-clean"  /path/to/log_file.log ;
then
         kill -TERM $CMD_PID
else 
        # if the output is ok, do something else
fi
4
ответ дан 20 July 2016 в 03:57

Сделал Вы пробуете что-то как этот:

some-command  &
PID=$!
wait $PID
while grep -q un-clean filename.log ; do
  kill -TERM $PID
  some-command  &
  PID=$!
  wait $PID
done

процесс будет уничтожен (см. killall: man killall) и re-run команда будет выполнена, в то время как файл filename.log содержит строку un-clean.

это помогает?

РЕДАКТИРОВАНИЕ: отправьте обновленное использование хорошего @Serg решения, и добавил эти wait команда для ожидания конца команды прежде, чем проверить файл журнала.

0
ответ дан 20 July 2016 в 03:57

Другие вопросы по тегам:

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