Unix:使用正则表达式搜索的 grep 命令的意外行为

Unix: Unexpected behavior of grep command with regex search

我有一个 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 命令的这种不一致行为背后的原因可能是什么?

感谢@Ed Morton 的评论。修复工作正常。
根本原因: 该变量未被引用,因此它可以进行通配、分词和文件名扩展,因此最终结果将取决于目录中的文件。

解决方案:改用 echo "$logentry" 并始终引用您的 shell 变量,除非您有特定目的而不这样做并完全理解所有含义。

Security implications of forgetting to quote a variable in bash/POSIX shells