Кажется, что необходимо обновить Ваш /etc/yum.repos.d
включать Ваш DVD. Посмотрите здесь для деталей: репозитории конфетки Установки с практическими рекомендациями, чтобы обновить или установить пакет из Изображения CD-ROM ISO
Можно передать по каналу tail -f
в sed
, сообщение этого выйти, когда это видит строку, Вы ищете:
tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'
sed
произведет каждую строку, которую это обрабатывает по умолчанию, и выход после того, как это видит ту строку. tail
процесс остановится, когда он попытается записать следующую строку и видит, что ее выходной канал повреждается
tail -f my-file.log | grep -qx "Finished: SUCCESS"
-q
, тихое значение, выходы, как только это находит соответствие
-x
делает grep
соответствуйте целой строке
Для второй части попробовать
tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"
-m <number>
говорит grep останавливаться после соответствий числа
и grep -q
статус выхода только будет 0
если SUCCESS
найден в конце строки
Если Вы хотите видеть весь вывод, Вы не можете использовать grep -q
, но можно все еще сделать
tail -f my-file.log | grep -m 1 "^Finished: "
который делает все кроме набора статус выхода к 1 если FAILURE
появляется.
grep
в моем ответе первоначально, но если он использует tail -f
он, вероятно, хочет видеть вывод файла; grep
движение не должно показывать все промежуточные строки
– Michael Mrozek♦
21.08.2012, 01:36
Вариация на ответ @Mikel с комментариями @Mrozek (я ответил бы на комментарии, но я думаю, что у меня еще нет достаточных полномочий),
tail -f my-file.log | tee >( grep -qx "Finished: SUCCESS" )
позволил бы Вам использовать решение @Mikel и все еще видеть вывод на экране
вот сценарий Python, который почти делает то, что я хочу (см. протесты ниже):
import sys,re
def main():
re_end = re.compile(sys.argv[1])
re_fail = re.compile(sys.argv[2]) if len(sys.argv) > 2 else None
for line in sys.stdin:
sys.stdout.write(line)
if re_end.match(line):
sys.exit(0)
elif re_fail and re_fail.match(line):
sys.exit(1)
if __name__ == '__main__': main()
протесты:
строки не печатаются, поскольку они входят..., они печатаются в группах..., кажется, некоторое продолжение буферизации
я должен был бы установить это как сценарий на моем пути или чем-то, таким образом, это неудобно, и я предпочел бы гладкую остроту :)
tail
кажется, делает ту же буферизацию, таким образом, я предполагаю, что это не что-то, что это стоит попытаться работать вокруг.
– aaronstacy
21.08.2012, 00:10
У меня были проблемы с sed
и grep
и их параметрами, поэтому я пишу свой один с условиями bash
tail -f screenlog.* |
while IFS= read line;
do
echo $line;
if [[ $line == *Started\ Application* ]];
then pkill tail;
fi;
done
Prueba tú también
grep -q 'App Started' <(tail -f /var/log/app/app.log)
Мне не понравился ни один из ответов, поэтому я решил написать свой. Этот bash-скрипт соответствует всем критериям и включает в себя БОНУС за выход 1 в случае сбоя.
#!/bin/bash
while IFS= read -r LOGLINE || [[ -n "$LOGLINE" ]]; do
printf '%s\n' "$LOGLINE"
[[ "${LOGLINE}" == "Finished: SUCCESS" ]] && exit 0
[[ "${LOGLINE}" == "Finished: FAILURE" ]] && exit 1
done < <(timeout 300 tail -f my-file.log)
exit 3
Также включена функция тайм-аута, которая приведет к коду выхода 3. Если в вашей системе нет команды тайм-аута, скачайте скрипт timeout.sh у Энтони Тиссена:
https://antofthy.gitlab.io/software/(поиск «Тайм-аут :»)
Согласно приведенным ниже комментариям, я обновил печать журнала, чтобы остановить расширение escape-символов, и включил все функции стандартного «чтения». См.https://stackoverflow.com/a/10929511для полной информации о чтении. Проверка EOF здесь не требуется, но включена для полноты картины.
q
команда берет дополнительный код выхода. Такsed
команда была быsed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
– Michael Mrozek♦ 21.08.2012, 00:14Finished: SUCCESS
последняя строка, выходного – lk- 21.08.2012, 00:15