如何使用“grep --fixed-strings”

如何使用“grep --fixed-strings”

的一部分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将搜索并捕获至少包含war或之一的任何行n。 (请注意,括号在 shell 中也很特殊,因此我们需要在命令行中引用它们。)

举个例子,假设我们想要从日志文件中查找错误消息,如下所示,其中包含如下行(因此,带有标记的行[err]):

[info] terrace lights on
[err] garage door control not responding

使用grep 'err'将匹配这两行,因为单词“tace"。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,而不是正则表达式解释,它会是aandb以及介于两者之间的任何内容。

或者,您可以将查找的字符串放入一个文件中,每行一个,并使用该-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

(请注意,进行“所有给定字符串”测试要困难得多。即使使用正则表达式,这也相当尴尬。)

相关内容