如何截断grep或ack返回的长匹配行

dan*_*dan 75 unix grep ack

我想在通常有很长行的HTML文件上运行ack或grep.我不想看到很长的线条反复包裹.但我确实希望看到围绕与正则表达式匹配的字符串的长行的那一部分.如何使用任何Unix工具组合获得此功能?

Eth*_*her 82

您可以使用grep选项-o,可能与更改模式相结合,".{0,10}<original pattern>.{0,10}"以便查看它周围的一些上下文:

       -o, --only-matching
              Show only the part of a matching line that matches PATTERN.

..或-c:

       -c, --count
              Suppress normal output; instead print a count of matching  lines
              for  each  input  file.  With the -v, --invert-match option (see
              below), count non-matching lines.

  • 例如:grep -oE".{0,20} mysearchstring.{0,20}"myfile (33认同)
  • 您应该更改添加-E选项的答案,如@Renaud(扩展模式选项)所示,或者扩展上下文的建议模式不起作用. (13认同)
  • 哦,这里有一个解决使用 `-oE ".{0,x}foo.{0,x}"` 方式(其中 `x` 是上下文的字符数)引起的高亮问题的方法 -- 追加 ` | grep foo ` 到最后。适用于 ack 或 grep 解决方案。更多解决方案也在这里:https://unix.stackexchange.com/questions/163726/limit-grep-context-to-n-characters-on-line (3认同)

And*_*ter 39

通过管道你的结果cut.我也在考虑添加一个--cut开关,所以你可以说--cut=80只有80列.

  • ``| cut = c1-120``对我不起作用,我需要做``| 切-c1-120`` (23认同)
  • 如果匹配的部分不在前80个字符中怎么办? (8认同)
  • FWIW我附加了`| 切割= c1-120`到grep,为我工作(虽然不知道如何切割匹配的文本) (3认同)
  • 我认为@edib 在语法上是准确的`| cut -c 1-100` /sf/answers/3426787171/ (2认同)
  • @AndyLester:使用“$COLUMNS”的“--no-wrap”选项怎么样? (2认同)

Jon*_*aun 21

您可以使用less作为ack的寻呼机并切断长线:ack --pager="less -S" 这样可以保留长线但是将其留在一条线而不是包裹.要查看更多行,请使用箭头键向左/向右滚动.

我为ack做了以下别名设置:

alias ick='ack -i --pager="less -R -S"' 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果你总是想使用它,你可以把 `--pager` 命令放在你的 ~/.ackrc 文件中。 (2认同)

Jos*_*hee 7

grep -oE ".\{0,10\}error.\{0,10\}" mylogfile.txt

在无法使用的异常情况下,请-E改用小写字母-e

解释: 在此处输入图片说明

  • 请勿使用反斜杠 - `grep -oE ".{0,10}error.{0,10}" mylogfile.txt` - 至少在 Z zhell 中 (3认同)

edi*_*dib 5

cut -c 1-100
Run Code Online (Sandbox Code Playgroud)

获取从1到100的字符。