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

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

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

egrep -r 'string1|string2|string3' /var/www/http

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

答案1

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

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

grep -Fe string1 -e string2 -e string3

或者:

grep -F 'string1
string2
string3'

-x如果这些固定字符串必须组成整个匹配行(而不是在任何地方找到),请添加该选项之内没有它的行)。大多数grep实现还可以-w选择单词例如,匹配 wherestring1会匹配 inside foo string1-2,但不匹配 inside foostring12

对于评论中的具体示例,那就是:

grep -wE 'Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll'

或者:

grep -we 'Allow from 8.8.2.5' -e 'Allow from 192.3.0.4' -e 'DenyAll'

您需要在此处使用-wor -x(假设这是整行,甚至周围没有空格),否则它也会匹配诸如 之类的行Allow from 8.8.2.51

你也可以这样写:

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

匹配整行 ( -x),但允许前导和尾随空格字符(此处使用[[:space:]]代替[[:blank:]]也允许在来自 MS-DOS 世界的行末尾找到 CR 字符)。

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

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

请注意,-wthere 不适用于,Allow因为它适用于整个匹配的字符串。例如,它会匹配GAllow from。一些grep实现支持\<,\>来匹配单词边界明确地(也称为\b某些):

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

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

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

答案2

问题是

grep -F -r 'string1|string2|string3' /var/www/http

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

你能做的就是使用

printf '%s\n' 'string1' 'string2' 'string3' | grep -f /dev/stdin -F -r /var/www/http

这将使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"

答案3

管道|需要\|像这样逃逸:

grep 'string1\|string2\|string3\' /var/www/http

相关内容