grep在来自变量时不匹配字符串

时间:2013-11-01 16:16:07

标签: regex bash grep

我正在编写一个帮助我处理日志文件的脚本。在其中,我将我的grep标志存储在变量中。标志和字符串本身工作正常,但是当我使用变量将它们传递给grep时,使用转义字符的字符串部分不会产生任何匹配。见下文:

grepvars="-B4 -Psihe 'caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe|\tat\s'"
grep -B4 -Psihe 'caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe|\tat\s' adapter_15.log > adapter_15-error1.log
grep $grepvars adapter_15.log > adapter_15-error2.log
wc -l *-error?.log
  51398 adapter_15-error1.log
  25032 adapter_15-error2.log

正如您所看到的,\ tat \ s部分在通过变量传递给grep时不会产生匹配。应该匹配的是(文字空格)的(文字标签)。虽然这可以在不使用变量的情况下正常工作,但我宁愿使用一个,因为它使我的多个grep调用更容易管理。我需要做些什么来确保grep在通过变量时正确执行此匹配?

3 个答案:

答案 0 :(得分:1)

在没有任何运气之后,我找到了一个解决方法:创建一个函数并在需要时调用它。这就是我想出的:

grep4j () {
unset IFS
nice -n 15 grep -B3 -Psihe '\tat\s|caused\sby|unable|fault|error|deadlock|checkpoint|corrupt|fail|exception|fatal|severe' $1
IFS=$'\n'
}

是的,我确实尝试在使用变量的grep字符串之前和之后取消设置IFS。它不起作用(我需要将它设置为其他工作)。做这样的功能满足了我的需求,也许它也会帮助别人。干杯!

如果您感到好奇,这是为了从log4j格式的日志中获取相关消息。它为我节省了很多时间。

答案 1 :(得分:0)

如果你在字符串中存储grep的所有选项,那么我猜你需要使用邪恶的eval

str="grep $grepvars adapter_15.log > adapter_15-error2.log"
eval "$str"

答案 2 :(得分:0)

可能更容易将选项填充到环境变量GREP_OPTIONS中,并将模式填充到文件中,如下所示:

grep -f <file-with-patterns> ...