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