如何截断由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选项(请参阅 下面),统计不匹配的行。
通过cut
pipe理你的结果。 我也在考虑添加一个–cut开关,所以你可以说–cut = 80,只有80列。
ack --pager="less -S"
这可以保留长行,但是保留在一行而不是包装。 要查看更多的行,请使用箭头键向左/向右滚动。
我有下面的别名安装ack来做到这一点:
alias ick='ack -i --pager="less -R -S"'
取自: http : //www.topbug.net/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个字符。