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

时间:2016-02-26 19:40:50

标签: unix grep logfile log-files

我有一个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 个答案:

答案 0 :(得分:0)

感谢@Ed Morton的评论。修复工作正常。
根本原因: 该变量未被引用,因此它对全局,单词拆分和文件名扩展开放,因此最终结果将取决于目录中的文件。

解决方案:使用echo“$ logentry”代替并总是引用你的shell变量,除非你有一个特定的目的,不这样做并完全理解所有的含义。

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