grep使用正则表达式中的错误

时间:2016-05-25 13:13:04

标签: regex grep

我想我在grep中发现了一个错误。如果我在命令行上对db日志运行这个grep语句,它运行正常。

grep "Query Executed in [[:digit:]]\{5\}.\?" db.log

我得到了这个结果:

  

查询在19699.188 ms执行;“select / * from xyztable .....

当我在脚本中运行它时

LONG_QUERY=`grep "Query Executed in [[:digit:]]\{5\}.\?" db.log`

结果中的星号将替换为当前目录中所有文件的列表。

echo $LONG_QUERY

结果:

  

查询于19699.188 ms执行; “从/ xyztable中选择不同的<list of files in current directory> .....

有没有人见过这种行为?

1 个答案:

答案 0 :(得分:2)

这不是grep中的错误。在理解如何解释脚本时,这是一个错误。

如果我写一个剧本:

echo *

我将得到一个文件名列表,因为shell(不是grep,而是/ bin / bash或/ bin / sh或你使用的任何shell)解释了一个未加引号的,未转义的星号作为替换文件名匹配的请求模式&#39; *&#39;,也就是所有这些。

如果我写一个剧本:

echo "*"

我会得到一个&#39; *&#39;,因为它是在带引号的字符串中。

如果我写:

STAR="*"
echo $STAR

我会再次获取文件名,因为我在将它分配给变量时引用了星号,但是当我将变量替换为命令时它变得不加引号。

如果我写:

STAR="*"
echo "$STAR"

我会得到一颗星,因为双引号允许变量插值。

您正在使用反引号 - 即命令周围的`字符。这会将命令的输出捕获到变量中。

我建议如果你要回显命令的结果,而不是其他的,你应该只是将结果重定向到一个文件。 (毕竟,当你的LONG_QUERY包含10,000行输出因为你的日志文件真的满了,你打算做什么?)

除此之外,至少做echo "$LONG_QUERY"(双引号)。