带引号的 Grep

14

我正在尝试扫描一个错误日志,查找包含503错误的行,所以我正在使用grep命令查找" 503(引号+空格+503)。

这似乎很简单,但它不起作用:

grep '" 503 ' access.log

我遇到了以下错误:

bash: -c: 第0行: 意外的EOF,寻找匹配的`"' bash: -c: 第1行: 语法错误: 意外的文件结尾


1
这应该可以工作。你确定没有别名 grep 或类似的东西吗?“which grep”?“type grep”? - pyroscope
错误信息显示“bash -c”,所以你是在尝试将单引号嵌入到另一个单引号中吗? - glenn jackman
嗯,在bash中,就像你写的那样,对我来说是有效的。 - Michael Berkowski
是的,我经常使用grep而没有任何问题。 - dtbarne
@Michael 现代 shell 的“问题”在于,它们经常自动转义这样的内容。 - Jacob
4个回答

18

看起来你是在某种语言中通过system()运行它,是吗?试试:

grep '\" 503 ' access.log

或:

grep "\" 503 " access.log

在终端中直接输入grep '" 503 ' access.log即可。为了重现您的问题,我必须执行:

bash -c 'grep '\" 503 ' access.log'

这确实是语法错误。要使它正常工作,我需要:

bash -c 'grep "\" 503 " access.log'

您某种方式调用了bash -c ...,可能是间接调用的。您需要找出是如何调用它以确定引号冲突的位置。


不,直接在shell中。我尝试了你提供的两个示例,但都没有成功。 - dtbarne
这很奇怪。你能发布“type grep”和“echo $0”的输出吗? - Michał Šrajer

1

我相信现在它已经可以工作了(不确定,因为我没有得到结果,但也没有出现错误)。

原因是因为我正在通过以下ssh命令传递它,我相信SSH正在进行一些转义技巧:

ssh 123.123.123.123 grep '" 503 ' access.log

将其修改为以下内容似乎是修复的方法:

ssh 123.123.123.123 "grep '\" 503 ' access.log"

感谢大家的时间。


2
不是ssh在进行恶作剧,而是shell。您的本地shell解释了单引号,并从 '" 503' 参数中剥离它们,然后将这些参数传递给ssh。然后ssh将收到的参数不变地传递到远程系统上的shell。该shell看到一个无法匹配的双引号字符。(可能还有一些细节,但这就是大体想法。) - Keith Thompson
@Keith说得非常正确。由于您的命令会被解释两次(一次是本地shell,另一次是远程shell),因此通常需要引用一次的任何内容都必须引用两次。 - jw013
谢谢,我知道那个。只是称之为诡计更容易理解 :) - dtbarne

1

如果要调试类似这样的奇怪效果,请使用“set -x”来显示shell扩展和计算机对您的命令的看法。


0
问题是由于 .bashrc 中的一些错误指令导致的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接