如何使用grep查找固定字符串?

Gur*_*aur 1 grep shell-script

grep如果未显示所需的输出,如何找到固定字符串grep -F?例如:

egrep -r 'string1|string2|string3' /var/www/http
Run Code Online (Sandbox Code Playgroud)

有了这个我们应该用什么?

Sté*_*las 6

要么使用grep -E(现代形式 for egrep),因此|被视为扩展的正则表达式交替运算符,但是您需要转义固定字符串中的所有其他正则表达式运算符(如., ?, *, ^, $, \, [, (, ), {, })。

或者使用-F并传递每行一个或多个-es的字符串:

grep -Fe string1 -e string2 -e string3
Run Code Online (Sandbox Code Playgroud)

或者:

grep -F 'string1
string2
string3'
Run Code Online (Sandbox Code Playgroud)

-x如果这些固定字符串必须构成整个匹配的行(而不是没有它的行中的任何地方找到),请添加该选项。大多数grep实现也有一个单词匹配-w选项,例如,将匹配 inside ,但不匹配inside 。string1foo string1-2foostring12

对于您在评论中的具体示例,那将是:

grep -wE 'Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll'
Run Code Online (Sandbox Code Playgroud)

或者:

grep -we 'Allow from 8.8.2.5' -e 'Allow from 192.3.0.4' -e 'DenyAll'
Run Code Online (Sandbox Code Playgroud)

您可能想要-wor -x(假设那是整行,甚至周围没有空格),否则它也会匹配Allow from 8.8.2.51.

你也可以这样写:

grep -xE '[[:space:]]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)[[:space:]]*'
Run Code Online (Sandbox Code Playgroud)

匹配整行 ( -x) 但允许前导和尾随空格字符(这里使用[[:space:]]而不是[[:blank:]]还允许在来自 MS-DOS 世界的行尾找到的 CR 字符)。

要在行中的任何位置而不是在注释中查找那些固定字符串,您需要确保通向这些固定字符串的行部分不包含#字符。所以像:

grep -wE '^[^#]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)'
Run Code Online (Sandbox Code Playgroud)

请注意,-wthere 不适用于,Allow因为它适用于整个匹配的字符串。所以它会匹配GAllow from例如。一些grep实现支持\<,显式\>匹配单词边界\b在某些情况下也称为):

grep -E '^[^#]*\<(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)\>'
Run Code Online (Sandbox Code Playgroud)

另请注意,在 中apache2,配置指令不区分大小写,单词之间允许有任意数量的空格。另外,我怀疑你的意思是Deny from all而不是DenyAll,所以也许你想要:

grep -iE '^[^#]*\<(allow[[:blank:]]+from[[:blank:]]+(8\.8\.2\.5|192\.3\.0\.4)|deny[[:blank:]]+from[[:blank:]]+all)\>'
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 1

问题是

grep -F -r 'string1|string2|string3' /var/www/http
Run Code Online (Sandbox Code Playgroud)

string1|string2|string3会在文件中查找文字字符串。请注意,由于您正在寻找固定字符串,因此没有理由使用egrep(或grep -E)。

你能做的就是使用

printf '%s\n' 'string1' 'string2' 'string3' | grep -f /dev/stdin -F -r /var/www/http
Run Code Online (Sandbox Code Playgroud)

这将使grep从标准输入(由 提供)读取要匹配的固定字符串printf,并使用它们来获取给定目录下任何文件中与它们匹配的所有行。

任何生成具有单独行的模式的文本文档的东西都可以替换printf上面的内容,包括一个简单的文本文件(可以直接由 读取grep -f textfile -F ...)。


您的评论示例:

查找以下文件中的任何字符串Allow from 8.8.2.5,Allow from 192.3.0.4和:DenyAll$dirpath

printf '%s\n' 'Allow from 8.8.2.5' 'Allow from 192.3.0.4' 'DenyAll' |
grep -f /dev/stdin -F -r "$dirpath"
Run Code Online (Sandbox Code Playgroud)