Unix: неожиданное поведение команды grep с поиском по регулярному выражению

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

Эта команда отлично работает в нашей среде разработки. Но в нашей производственной среде он выводит ответ, отличный от записи в лог-файле.

Вот команда:

logentry=$(grep -m1 -oP '.*(?<=Reset\s).*' $log)

Фактическая запись в файле журнала:

******Reset  Counter:[Total:1849766] [Success:1849766]  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

Вывод команды:

******Reset  Counter:[Total:1849766] 1  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

Ожидаемый результат:

 ******Reset  Counter:[Total:1849766] [Success:1849766]  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

Что может быть причиной этого непоследовательного поведения команды grep?

1 ответ

Решение

Спасибо @Ed Morton за комментарий. Исправление работает нормально.
Основная причина: переменная не заключена в кавычки, поэтому она открыта для глобализации, разделения слов и расширения имени файла, поэтому итоговый результат будет зависеть от файлов в вашем каталоге.

Решение: используйте вместо этого echo "$logentry", и ВСЕГДА указывайте переменные оболочки, если только вы не имеете в виду какую-то конкретную цель, не делая этого, и полностью понимаете все последствия.

Последствия для безопасности: забыть заключить переменную в оболочку bash/POSIX

Другие вопросы по тегам