grep:在给定位置开始匹配行(跳过前 n 个字符)

grep:在给定位置开始匹配行(跳过前 n 个字符)

我有包含以下格式行的文件:

2021-Jan-26 05:35  foo bar 2
2021-Jan-26 05:37  asdf 2 foo bar
2021-Jan-26 05:37  foo

我感兴趣的模式从位置 20 开始。因此,当我 grep 文件中查找特定模式时,我想跳过(不匹配)前 19 个字符。

因此,我想匹配该行中除前 19 个字符之外的任何位置的模式

在上面的示例中,如果我 grep for 2,我只想匹配第 1 行和第 2 行。

我怎样才能做到这一点grep

答案1

使用 GNU 的选项grep,它将忽略前 19 个字符并仅匹配您需要的模式:

grep -P "(?<=.{19})2" file

输出:

2021年1月26日 05:35 富吧2
2021年1月26日 05:37 asdf2富酒吧

答案2

您实际上确实想要匹配前 19 个,但将它们匹配为“任何内容”。

所以

grep '^....................*2' 

有20个点。将^图案锚定到行的开头。接下来的 19 个点分别匹配一个字符,实际上是跳过它们。然后来.*匹配零个或多个字符,然后来2匹配你想要的模式。

您可以通过以下方式提高效率

grep '^..................[^2]*2'

它匹配行的开头,然后是 19 个字符,然后是零个或多个2不是2.在这种情况下不会有任何显着差异,但如果正在搜索的模式更复杂,那么这种优化可能会有很大帮助。

相关内容