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

时间:2010-01-09 20:19:50

标签: grep unix ack

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

10 个答案:

答案 0 :(得分:72)

您可以使用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.

答案 1 :(得分:38)

通过cut管道您的搜索结果。我也在考虑添加一个--cut开关,以便您可以说--cut=80并且只能获得80列。

答案 2 :(得分:21)

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

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

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

答案 3 :(得分:4)

cut -c 1-100

获取1到100之间的字符。

答案 4 :(得分:2)

enter image description here

在无法使用-E的异常情况下,可以使用:

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

答案 5 :(得分:1)

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

建议的方法".{0,10}<original pattern>.{0,10}"非常好,只是突出显示的颜色经常搞砸了。我创建了一个类似输出的脚本,但颜色也保留了下来:

#!/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 -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -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应显示匹配的行,但匹配字符串周围只有10个字符。

答案 6 :(得分:0)

我将以下内容放入了.bashrc

grepl() {
    $(which grep) --color=always $@ | less -RS
}

然后可以在命令行上将greplgrep一起使用。使用箭头键查看较长线条的尾部。使用q退出。

说明:

  • grepl() {:定义一个新功能,该功能将在每个(新)bash控制台中可用。
  • $(which grep):获取grep的完整路径。 (Ubuntu为grep定义了一个别名,该别名与grep --color=auto等效。我们不希望该别名,而是原来的grep。)
  • --color=always:为输出着色。 (由于--color=auto检测到输出已放入管道中并且因此不会着色,因此别名中的grep无法正常工作。)
  • $@:将所有给定grepl函数的参数放在这里。
  • less:使用less
  • 显示行
  • -R:显示颜色
  • S:不要打乱行

答案 7 :(得分:0)

这就是我要做的:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

在我的.bash_profile中,我override grep使其自动在运行tput rmam之前和之后运行tput smam,这会禁用自动包装功能,然后重新启用它。

答案 8 :(得分:0)

ag 也可以使用正则表达式,如果您愿意的话:

ag --column -o ".{0,20}error.{0,20}"

答案 9 :(得分:0)

The Silver Searcher (ag) 通过 --width NUM 选项本身支持它。它将用 [...] 替换其余较长的行。

示例(120 个字符后截断):

 $ ag --width 120 '@patternfly'
 ...
 1:{"version":3,"file":"react-icons.js","sources":["../../node_modules/@patternfly/ [...]

在 ack3 中,similar feature is planned 但目前尚未实现。