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

我想对通常有很长行的HTML文件运行ack或grep。 我不想看到很长的行重复包装。 但是我确实希望看到围绕与正则expression式匹配的string的那一部分。 我怎样才能得到这个使用Unix工具的任何组合?

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

        -o, - 唯一匹配
              仅显示匹配PATTERN的匹配行的一部分。

..或者-c

        -c,--count
              抑制正常输出; 而是打印一行匹配的行
              为每个input文件。 使用-v,--invert-match选项(请参阅
              下面),统计不匹配的行。

通过cutpipe理你的结果。 我也在考虑添加一个–cut开关,所以你可以说–cut = 80,只有80列。

ack --pager="less -S"这可以保留长行,但是保留在一行而不是包装。 要查看更多的行,请使用箭头键向左/向右滚动。

我有下面的别名安装ack来做到这一点:

 alias ick='ack -i --pager="less -R -S"' 

取自: http : //www.topbug.ne​​t/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

build议的方法".{0,10}<original pattern>.{0,10}"除了突出显示的颜色经常混乱之外,是非常好的。 我创build了一个具有类似输出的脚本,但颜色也保留了下来:

 #!/bin/bash # Usage: # grepl PATTERN [FILE] # how many characters around the searching keyword should be shown? context_length=10 # What is the length of the control character for the color before and after the # matching string? # This is mostly determined by the environmental variable GREP_COLORS. control_length_before=$(($(echo a | grep --color=always a | cut -da -f '1' | wc -c)-1)) control_length_after=$(($(echo a | grep --color=always a | cut -da -f '2' | wc -c)-1)) grep -E --color=always "$1" $2 | grep --color=none -oE \ ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}" 

假设脚本保存为grepl ,那么grepl pattern file_with_long_lines应显示匹配行,但匹配string周围只有10个字符。