Как найти слово перед совпадением

Как найти слово перед совпадением

У меня есть следующий файл журнала. Мне нужно узнать, есть ли какие-либо неисправности/подозрительные состояния, используя скрипт оболочки.

Мне нужно найти ошибку и проверить предыдущее слово. Если оно больше 0, то это работа для администратора баз данных.

Checking pubs2: Logical pagesize is 4096 bytes
DBCC CHECKSTORAGE for database 'pubs2' sequence 17 completed at Oct 21 2015  3:17PM. 4 faults and 0 suspect conditions were located. 0 checks were aborted. You should investigate the recorded faults, and plan a course of action that will correct them.

Я уже попробовал следующие команды в оболочке Linux/Bash, и они работают хорошо.

FLTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+faults and)'`
SPTCNT=`cat $MAILLOG | grep -oP '\S+(?=\s+suspect)'`

if [ $FLTCNT -gt 0 ] || [ $SPTCNT -gt 0 ] ; then
    FAILED="Y"
#   echo "Fault / suspect conditions found"
    cat $MAILLOG >> $ERRLOG
fi

Но когда я выполняю то же самое на сервере AIX, я получаю ошибку

grep: illegal option -- o
grep: illegal option -- P
usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
    [-f pattern_file...] [file...]
usage: grep [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...]
    -f pattern_file... [file...]

решение1

Предположим, вы хотите что-то сделать, если любая из двух строк X faultsи Y suspectдля любых положительных целых значений X, Yне равных, 0существует в файле $MAILLOG.

if grep -qwE '([1-9]|[0-9]{2,}) (faults|suspect)' "$MAILLOG"; then
    # do something
fi

Шаблон ([1-9]|[0-9]{2,})будет соответствовать либо одной цифре больше нуля, либо любому числу, состоящему из двух или более цифр.

Шаблон (faults|suspect)будет соответствовать либо строке faults, либо suspect. Если вы хотите включить checksтуда тоже, просто используйте (faults|suspect|checks).

Параметр -qотключает grepлюбой вывод, не содержащий ошибок, который утилита могла бы выдать в противном случае (нас интересует только статус завершения grep, т. е. удалось ли ей сопоставить шаблон или нет).

Опция -wmake grepвыполняет "поиск слова". В этом случае это означает, что он найдет 10 faults, а не подстроку, 0 faultsтак как ноль в 10не начинает новое "слово", а 1начинает. Это также означает, что строка 2 faultsmen(какой бы маловероятной она ни была) не вызовет совпадение.

Необходимо -Eдля поддержки расширенных регулярных выражений с использованием чередования ( |).

решение2

Вы можете попробовать использовать grep:

grep -c "your word to match" /log/file

Например:

$ grep -c "upgraded" /var/log/pacman.log 
244

Связанный контент