Bash: проверка чисел внутри строки ближе к «большому» файлу журнала - PullRequest
1 голос
/ 21 октября 2010

Что я пытаюсь сделать: создать скрипт bash, который выполняет некоторые тесты в моей системе, который затем читает некоторые файлы журналов, и в конце указывает мне на некоторые анализы.

У меня есть, например, файл журнала (и, хотя иногда он не такой большой, я хочу сохранить процесс, когда это возможно), который в конце концов выглядит примерно так:

Ran 6 tests with 1 failures and 0 errors in 1.042 seconds.
Tearing down left over layers:
Tear down Products.PloneTestCase.layer.PloneSite in 0.463 seconds.
Tear down Products.PloneTestCase.layer.ZCML in 0.008 seconds.

И у меня уже есть эта строка bash, которая занимает нужную мне строку (строку с ошибками и ошибками):

error_line=$(tac $p.log | grep -m 1 '[1-9] .* \(failures\|errors\)')

Obs: Может кто-нибудь ответить мне, если 'tac' передает процесс grep для каждой строки файла, или сначала он загружает файл отверстия в память, а затем grep запускает отверстие "переменная памяти"? Потому что я думал о запуске grep для каждой строки, и когда приходит нужная мне строка, я прекращаю процесс "обработки".
Если он работает таким образом («подбрасывает» каждую строку), когда grep находит то, что хочет (с опцией -m 1), он останавливает процесс tac? Как я это сделаю?
Кроме того, вы знаете лучший способ?

Продолжение ...

Итак, результат команды:

Ran 6 tests with 1 failures and 0 errors in 1.042 seconds.

Теперь я хочу проверить, что оба значения '1' и '0' в переменной $ error_line равны 0 (как будто их нет в этом случае), поэтому, если любое из них отличается, я может выполнить какой-то другой процесс, чтобы определить, какая-то ошибка или сбой были найдены.

Ответы

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Когда grep выходит из-за того, что шаблон найден, SIGPIPE отправляется на tac, вызывая его выход, поэтому он не будет продолжать работать без необходимости.

read failures errors <<< $(tac $p.log | grep -Pom 1 '(?<= )[0-9]*(?= *(failures|errors))')
if [[ $failures == 0 && $errors == 0 ]]
then
    echo "success"
else
    echo "failure"
fi

grep Команда будет выводить только числа, найденные перед словами «сбои» и «ошибки», без вывода любого другого текста в строке.

Редактировать:

Есливаш grep не имеет -P, измените первую строку выше на:

read failures errors <<< $(tac $p.log | grep -om 1 ' [0-9]* *\(failures\|errors\)' | cut -d ' ' -f 2

или, чтобы использовать вариант ответа Игнасио, на:

read failures errors <<< $(tac $p.log | awk '/^Ran/ {printf "%s\n%s\n", $5, $8}'
0 голосов
/ 21 октября 2010

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

   grep "^Ran" very_big_log_file | awk '{print $5$8=="00"?"no failure":"failure"}'

В противном случае подойдет только awk.

awk '{print $5$8=="00"?"no failure":"failure"}'
0 голосов
/ 21 октября 2010

AWK:

/^Ran / {
  print "No failures: " ($5 == 0)
  print "No errors: " ($8 == 0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...