的一部分grep --help
是:
-E, --extended-regexp PATTERNS are extended regular expressions
-F, --fixed-strings PATTERNS are strings
网上有很多例子,-E
但我找不到-F
我不太擅长正则表达式,如果可以的话尽量避免使用它,所以这-F
看起来是一个更好的选择。
使用 grep 来查看某个对象是否包含 3 个不同字符串的语法是什么?
答案1
正如您所指出的,选项-F
或--fixed-string
禁用正则表达式引擎并搜索文字字符串。查找属于有效正则表达式但具有不同含义的字符串很有用。例如:
grep -Fe '[warn]' app.log
该[warn]
模式是有效的基本正则表达式 ( BRE
),因此如果没有该-F
选项,grep
将搜索并捕获至少包含w
、a
、r
或之一的任何行n
。 (请注意,括号在 shell 中也很特殊,因此我们需要在命令行中引用它们。)
举个例子,假设我们想要从日志文件中查找错误消息,如下所示,其中包含如下行(因此,带有标记的行[err]
):
[info] terrace lights on
[err] garage door control not responding
使用grep 'err'
将匹配这两行,因为单词“t呃ace"。grep '[err]'
也会匹配这两行,因为两者都有一个“e”(和一个“r”)。但在这里,这grep -F '[err]'
是一种简单的方法来将匹配限制为仅标签。(或者,可以使用默认的正则表达式匹配并转义括号:grep -e '\[err\]'
, 或grep -e '[[]err[]]'
什至grep '[[]err]'
. 但这更难看。)
如果您有更多模式要搜索,您可以-e
多次使用该选项:
grep -F -e '[warn]' -e '[debug]' -e '[err]' app.log
线路匹配任何的模式(至少一个)将被匹配。
-x
,选项--line-regex
在这种情况下也很有用,因为它意味着只有整行与模式匹配时才认为该行匹配。例如,grep -x foo
如果一行是,则匹配foo
,但如果该行是,则不匹配foobar
。并且-Fx
在一起只会找到完全匹配的行,无论它们包含什么特殊字符。
答案2
要获取test.txt
至少包含一个字符串hello
或 的行goodbye
,您可以使用:
grep -F -e hello -e goodbye test.txt
也就是说,要查找的模式作为选项的参数给出-e
,并且-F
选项告诉将它们视为固定字符串。好吧,这与上面的内容无关,但是例如像这样的模式a.*b
会寻找a
、点、星号和 a b
,而不是正则表达式解释,它会是a
andb
以及介于两者之间的任何内容。
或者,您可以将查找的字符串放入一个文件中,每行一个,并使用该-f
选项给出文件名:
$ grep -F -f patterns.txt test.txt
you say hello when you arrive
goodbye when you leave
but rarely say hello and goodbye at the same time
(请注意,进行“所有给定字符串”测试要困难得多。即使使用正则表达式,这也相当尴尬。)