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'
您需要在此处使用-w
or -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)'
请注意,-w
there 不适用于,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