'хвост-f' до текста замечен

Кажется, что необходимо обновить Ваш /etc/yum.repos.d включать Ваш DVD. Посмотрите здесь для деталей: репозитории конфетки Установки с практическими рекомендациями, чтобы обновить или установить пакет из Изображения CD-ROM ISO

20
21.08.2012, 00:17
7 ответов

Можно передать по каналу tail -f в sed, сообщение этого выйти, когда это видит строку, Вы ищете:

tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'

sed произведет каждую строку, которую это обрабатывает по умолчанию, и выход после того, как это видит ту строку. tail процесс остановится, когда он попытается записать следующую строку и видит, что ее выходной канал повреждается

39
27.01.2020, 19:43
  • 1
    booh да!прекрасно.... так случайно есть ли способ выйти 0, если я соответствую одной вещи (скажите 'УСПЕХ'), и 1, если я соответствую чему-то еще (как, возможно, 'ОТКАЗ')? –  aaronstacy 21.08.2012, 00:12
  • 2
    @aaronstacy, Если Вы используете GNU grep, q команда берет дополнительный код выхода. Так sed команда была бы sed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1' –  Michael Mrozek♦ 21.08.2012, 00:14
  • 3
    Это не могло бы работать если Finished: SUCCESS последняя строка, выходного –  lk- 21.08.2012, 00:15
  • 4
    @Michael Mrozek aaaand, конечно, я не b/c, я использую изобретенный friggin mac –  aaronstacy 21.08.2012, 00:16
  • 5
    Это решение имеет главный дефект: в моем случае журнал заканчивается искавшей строкой. Больше строк не будет записано так, процесс остался бы застрявшим, поскольку хвост не имеет никакого способа повредить :( –  Phate 16.03.2018, 16:32
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 появляется.

6
27.01.2020, 19:43
  • 1
    я использовал grep в моем ответе первоначально, но если он использует tail -f он, вероятно, хочет видеть вывод файла; grep движение не должно показывать все промежуточные строки –  Michael Mrozek♦ 21.08.2012, 01:36

Вариация на ответ @Mikel с комментариями @Mrozek (я ответил бы на комментарии, но я думаю, что у меня еще нет достаточных полномочий),

tail -f my-file.log | tee >( grep -qx "Finished: SUCCESS" )

позволил бы Вам использовать решение @Mikel и все еще видеть вывод на экране

4
27.01.2020, 19:43
  • 1
    Можем мы добавлять интервал тайм-аута к этому, как: "если не чтение между 60 - 120 секундами, то прервите хвост и дайте ошибочный код выхода в оболочке"? –  kiltek 15.03.2018, 10:50

вот сценарий 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()

протесты:

  • строки не печатаются, поскольку они входят..., они печатаются в группах..., кажется, некоторое продолжение буферизации

  • я должен был бы установить это как сценарий на моем пути или чем-то, таким образом, это неудобно, и я предпочел бы гладкую остроту :)

0
27.01.2020, 19:43
  • 1
    : 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
1
27.01.2020, 19:43

Prueba tú también

 grep -q 'App Started' <(tail -f /var/log/app/app.log)
2
27.01.2020, 19:43

Мне не понравился ни один из ответов, поэтому я решил написать свой. Этот 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 здесь не требуется, но включена для полноты картины.

5
27.01.2020, 19:43

Теги

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