0

我正在编写一个脚本来帮助我处理日志文件。在其中,我将我的 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 在通过变量时正确执行此匹配?

4

3 回答 3

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 格式的日志中获取相关消息。它节省了我很多时间。

于 2013-11-06T20:38:04.073 回答
0

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

grep -f <file-with-patterns> ...
于 2013-11-01T16:27:35.530 回答
0

如果您将 grep 的所有选项存储在一个字符串中,那么我想您需要使用 evil eval

str="grep $grepvars adapter_15.log > adapter_15-error2.log"
eval "$str"
于 2013-11-01T16:19:47.373 回答