比赛前后的Grep角色?

Leg*_*end 125 bash grep

使用这个:

grep -A1 -B1 "test_pattern" file
Run Code Online (Sandbox Code Playgroud)

将在文件中匹配的模式之前和之后生成一行.有没有办法显示不是行而是指定数量的字符?

我文件中的行非常大,所以我对打印整行不感兴趣,而只是在上下文中观察匹配.有关如何做到这一点的任何建议?

ДМИ*_*КОВ 159

前3个字符后4个字符

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
Run Code Online (Sandbox Code Playgroud)

  • 在Mac OSX上不可用,所以这不是一个广泛可用的解决方案.-E版本(下面列出)是一个更好的解决方案.什么是-P?继续阅读... -P, - perl-regexp将PATTERN解释为Perl正则表达式(PCRE,见下文).这是高度实验性的,grep -P可能会警告未实现的功能. (5认同)
  • 对于少量数据的一个很好的答案,但是当你匹配> 100个字符时它会开始变慢 - 例如在我的巨型xml文件中,我想要{1,200}之前和之后,并且它太慢而无法使用. (4认同)
  • @amit_g的awk版本要快得多. (3认同)
  • 在 OSX 上通过以下方式安装:`brew install homebrew/dupes/grep` 并将其作为 `ggrep` 运行。 (2认同)

eks*_*kse 98

grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 
Run Code Online (Sandbox Code Playgroud)

这将在您的模式之前和之后匹配最多5个字符.-o开关告诉grep只显示匹配,-E使用扩展正则表达式.确保在表达式周围加上引号,否则shell可能会解释它.

  • 很好的答案,有趣的是,{} 中的长度上限为 2^8-1,因此“{0,255}”有效,“{0,256}”给出“grep:无效的重复计数” (4认同)
  • 当我增加匹配字符的数量(5 -> 25 -> 50)时,这似乎会大大降低性能,知道为什么吗? (2认同)

ami*_*t_g 37

你可以用

awk '/test_pattern/ {
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
Run Code Online (Sandbox Code Playgroud)

  • 你如何使用它来找到每行多个匹配? (3认同)
  • 即使使用更大的文件也能很好地工作 (2认同)
  • 花括号对中第一个数字的意义是什么?就像 "grep -E -o ".{0,5}test_pattern.{0,5}" test.txt "中的 0 一样? (2认同)

rua*_*akh 24

你的意思是,像这样:

grep -o '.\{0,20\}test_pattern.\{0,20\}' file
Run Code Online (Sandbox Code Playgroud)

这将在两侧打印多达20个字符test_pattern.该\{0,20\}标记是一样*的,但指定零到二十重复,而不是零或more.The -o说,只显示了比赛本身,而不是整条生产线.