
У меня есть следующий файл журнала. Мне нужно узнать, есть ли какие-либо неисправности/подозрительные состояния, используя скрипт оболочки.
Мне нужно найти ошибку и проверить предыдущее слово. Если оно больше 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
, т. е. удалось ли ей сопоставить шаблон или нет).
Опция -w
make 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