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

如何截断grep或ack返回的长匹配行,grep,unix,ack,Grep,Unix,Ack,我想在通常有很长行的HTML文件上运行ack或grep。我不想看到很长的线反复缠绕。但我确实希望看到一条长线的那一部分,它围绕着一个与正则表达式匹配的字符串。如何使用Unix工具的任何组合来实现这一点?您可以使用grep选项-o,可能还可以将模式更改为“{0,10}.{0,10}”,以查看相关上下文: -o, --only-matching Show only the part of a matching line that matches PATTERN. 通过cu

我想在通常有很长行的HTML文件上运行ack或grep。我不想看到很长的线反复缠绕。但我确实希望看到一条长线的那一部分,它围绕着一个与正则表达式匹配的字符串。如何使用Unix工具的任何组合来实现这一点?

您可以使用grep选项
-o
,可能还可以将模式更改为
“{0,10}.{0,10}”
,以查看相关上下文:

-o, --only-matching Show only the part of a matching line that matches PATTERN.
通过
cut
导入结果。我也在考虑添加一个
--cut
开关,这样你就可以说
--cut=80
,并且只得到80列。

你可以用较少的内容作为ack的寻呼机并切掉长行:
ack--pager=“less-S”
这会保留长行,但只保留一行而不是换行。要查看该行的更多内容,请使用箭头键向左/向右滚动至更少内容

我为ack设置了以下别名以执行此操作:

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

建议的方法“{0,10}.{0,10}”非常好,只是突出显示的颜色经常弄乱。我创建了一个具有类似输出的脚本,但颜色也保留了下来:

#/bin/bash
#用法:
#grepl模式[文件]
#搜索关键字周围应显示多少个字符?
上下文长度=10
#颜色的控制字符的长度是多少
#匹配字符串?
#这主要由环境变量GREP_COLORS决定。
control|u length_before=$($(echo a | grep--color=始终a | cut-da-f'1'| wc-c)-1))
control|u length_after=$($(echo a | grep--color=始终a | cut-da-f'2'| wc-c)-1))
grep-E--color=始终为“$1”$2|
grep--color=none-oE\
“{0,$($control_length_before+$context_length))}$1.{0,$($control_length_before+$context_length))}”
假设脚本保存为
grepl
,则带有长行的
grepl模式文件应显示匹配行,但匹配字符串周围只有10个字符

cut -c 1-100

获取从1到100的字符。

我将以下内容放入我的
.bashrc

grepl() {
    $(which grep) --color=always $@ | less -RS
}
然后,您可以在命令行中将
grepl
grep
可用的任何参数一起使用。使用箭头键查看较长线条的尾部。使用
q
退出

说明:

  • grepl(){
    :定义将在每个(新)bash控制台中可用的新函数
  • $(哪个grep)
    :获取
    grep
    的完整路径(Ubuntu为
    grep
    定义了一个别名,相当于
    grep--color=auto
    。我们不需要这个别名,只需要原始的
    grep
  • --color=always
    :为输出着色。(
    --color=auto
    来自别名的将不起作用,因为
    grep
    检测到输出被放入管道中,然后不会对其着色。)
  • $@
    :将给定给
    grepl
    函数的所有参数放在此处
  • less
    :使用
    less
  • -R
    :显示颜色
  • S
    :不要打断长行
    • 以下是我的工作:

      function grep () {
        tput rmam;
        command grep "$@";
        tput smam;
      }
      
      在我的.bash_配置文件中,我对其进行grep,使其在之前和之后自动运行
      tputrmam
      ,这将禁用包装,然后重新启用它。

      grep-oE.\{0,10\}错误。\{0,10\}mylogfile.txt
      在不能使用
      -E
      的异常情况下,请使用小写的
      -E

      说明:
      ag
      如果您愿意,也可以使用正则表达式技巧:

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

      什么是
      ack
      ?当你不喜欢某样东西时,它是你使用的一个命令吗?像是
      ack file\u长行| grep模式
      ?:-)@Alok
      ack
      (Debian上称为
      ack grep
      )是
      grep
      类固醇。它还有
      --thpppt
      选项(不是开玩笑)。谢谢。我今天学到了一些东西。虽然
      --thpppt
      功能有点争议,但关键的优势似乎是您可以直接使用Perl正则表达式,而不是一些疯狂的
      [[:space:]
      {
      [
      ,等等。用
      -e
      -e
      来改变意思,以一种不可能记住的方式切换。类似的:如果匹配的部分不在前80个字符中怎么办?FWIW我在grep中附加了
      | cut=c1-120
      ,对我来说很有用(尽管我不知道如何剪切匹配的文本)
      |cut=c1-120
      对我不起作用,我需要做
      |cut-c1-120
      我认为@edib在语法上是准确的
      |cut-c1-100
      @AndyLester:那一个
      --没有使用
      $COLUMNS
      的wrap
      选项呢?例如:grep-oE.{0,20}mysearchstring.{0,20}myfileyou应该将答案更改为添加-E选项,如@Renaud所示(扩展模式选项),否则用于扩展上下文的建议模式将不起作用。可能不需要这样做,但这里有一个示例:
      $echo“eeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq。{0,20}MYSTRING.{0,20}./fileonelongline.txt
      打印
      QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ字符串,因为整个过程都变成了搜索模式。我希望找到一种方法,在搜索结果周围保留一些未突出显示的上下文,以便更轻松地进行视觉扫描和结果解释。哦,这里有一个解决使用
      -oE.{0,x}foo.{0,x}”
      方法引起的突出显示问题的方法(其中
      x
      是上下文的字符数)--在末尾附加“| grep foo”。适用于ack或grep solut
      ag --column -o ".{0,20}error.{0,20}"