grep如果未显示所需的输出,如何找到固定字符串grep -F?例如:
egrep -r 'string1|string2|string3' /var/www/http
Run Code Online (Sandbox Code Playgroud)
有了这个我们应该用什么?
要么使用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)
问题是
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)
| 归档时间: |
|
| 查看次数: |
5875 次 |
| 最近记录: |