Я не присматривался к разделу sed
/ awk
/ и т. Д. (И с ними будет сложно работать без некоторых примеров данных), но вы должны быть в состоянии поделиться исходным сканированием * 1003. * поиск строк, соответствующих любому шаблонов, сохранение их во временном файле и последующий поиск только отдельных шаблонов. Я бы также использовал find ... -exec
вместо find ... | xargs
:
tempfile=$(mktemp "${TMPDIR:-/tmp}/logextract.XXXXXX") || {
echo "Error creating temp file" >&2
exit 1
}
find $LOGS -mtime -30 -type f -exec grep -B 2 -Ew "RESULT err=(0|49) tag=97" {} + >"$tempfile"
grep -B 2 -w "RESULT err=0 tag=97" "$tempfile" | grep -w "BIND" | ...
grep -B 2 -w "RESULT err=0 tag=97" "$tempfile" | grep -E 'BIND|LDAP connection from*' | ...
grep -B 2 -w "RESULT err=49 tag=97" "$tempfile" | grep -w "BIND" | ...
rm "$tempfile"
Кстати, вы, вероятно, не хотите искать LDAP connection from*
- from*
в конце означает «сюда», за которым следуют 0 или более символов «м».
Пара общих рекомендаций по написанию сценариев: используйте переменные в нижнем или смешанном регистре, чтобы избежать случайных конфликтов с различными именами всех заглавных букв, которые имеют особое значение. (За исключением случаев, когда вы хотите особое значение, например, настройка PATH
.)
Кроме того, использование двойных кавычек вокруг ссылок на переменные, как правило, является хорошей идеей для предотвращения неожиданного разделения слов и раскрытия подстановочных знаков ... за исключением того, что в некоторых местах ваш скрипт зависит от этого, например, установка LOGS="/log_dump/ldap/c*"
, а затем подсчет подстановочных знаков расширение происходит, когда используется переменная. В этих случаях обычно лучше использовать массив bash для хранения каждого элемента (например, имени файла) как отдельного элемента:
logs=(/log_dump/ldap/c*) # Wildcard gets expanded when it's defined
...
find "${logs[@]}" -mtime ... # All that syntax gets all array elements in unmangled form
Обратите внимание, что в действительности это не нужно в тех случаях, когда вы знаете, что в переменной не будет никаких неожиданных подстановочных знаков или пробелов, но когда вы имеете дело с неограниченными данными, этот метод более безопасен. (Я работаю в основном на macOS, где пробелы в именах файлов являются просто фактом жизни, и я научился трудному способу использовать идиомы сценариев, которые ими не смущают.)