2

我的文件包含以下几行:

hello_400 [200]
world_678 [201]
this [301]
is [302]
your [200]
friendly_103 [404]
utility [200]
grep [200]

我只是在寻找以 . 结尾的行[200]。我确实尝试使用以下模式转义方括号:

  • cat file | grep \[200\]
  • cat file | grep \\[200\\]$

结果要么包含所有行,要么不包含任何内容。这很令人困惑。

4

2 回答 2

2

我建议转义[]用单引号引用完整的正则表达式,以防止您的外壳解释正则表达式。

grep '\[200\]$' file

输出:

你好_400 [200]
你的 [200]
实用程序 [200]
grep [200]
于 2021-09-19T07:36:03.627 回答
1

除非您出于某种原因需要删除引号(例如文件名扩展),否则请始终在 shell 中的字符串周围使用引号(例如文件名扩展),请参阅https://mywiki.wooledge.org/Quotes,因此默认情况下使用 dogrep 'foo'而不是grep foo. 然后,您只需转义字符串中的正则[表达式元字符以使其成为文字,即grep '\[200]' file.

而不是使用 grep 并且必须转义正则表达式元字符以使它们表现为文字,只需使用支持特定字段上的文字字符串比较的 awk :

$ awk '$NF=="[200]"' file
hello_400 [200]
your [200]
utility [200]
grep [200]

或全线:

$ awk 'index($0,"[200]")' file
hello_400 [200]
your [200]
utility [200]
grep [200]
于 2021-09-19T13:36:20.817 回答