Colorized grep - 使用突出显示的匹配查看整个文件

时间:2009-06-11 14:55:30

标签: bash shell colors grep

我发现grep的{​​{1}}标志非常有用。但是,grep只打印带匹配的行(除非您要求上下文行)。鉴于它打印的每一行都有匹配,突出显示不会增加尽可能多的功能。

我真的想--color=always一个文件,并看到整个文件突出显示模式匹配。

有什么方法可以告诉grep打印每一行都被读取,无论是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇这是否可以使用标准cat

22 个答案:

答案 0 :(得分:725)

以下是一些方法:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file

答案 1 :(得分:83)

这是一回事。很有可能,你会少用,所以试试这个:

less -p pattern file

它将突出显示模式并跳转到文件中第一次出现的模式。

答案 2 :(得分:46)

我想推荐ack -- better than grep, a power search tool for programmers

$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}"
$ ack --passthru pattern files

我喜欢它,因为它默认为递归搜索目录(并且比grep -r更加智能),支持完整的Perl正则表达式(而不是POSIXish regex(3)),并且具有更好的效果搜索多个文件时显示上下文。

答案 3 :(得分:18)

您还可以创建别名。在.bashrc中添加此函数(或在osx上添加.bash_profile)

function grepe {
    grep --color -E "$1|$" $2
}

您现在可以使用以下别名:“ifconfig | grepe inet”或“grepe css index.html”。

(PS:不要忘记source ~/.bashrc在当前会话中重新加载bashrc)

答案 4 :(得分:17)

您可以使用https://github.com/kepkin/dev-shell-essentials

中的highlight脚本

更好grep更好,因为您可以使用自己的颜色突出显示每个匹配

$ command_here | highlight green "input" | highlight red "output"

Screen shot from Github project

答案 5 :(得分:12)

使用colout计划:http://nojhan.github.io/colout/

它旨在为文本流添加颜色突出显示。给定正则表达式和颜色(例如“红色”),它再现具有突出显示的匹配的文本流。 e.g:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

您可以链接多个调用以添加多个不同的颜色突出显示:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

或者你可以通过使用带有N组的正则表达式(正则表达式的括号部分)来实现相同的功能,然后使用逗号分隔的N种颜色列表。

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red

答案 6 :(得分:7)

我使用来自“Linux Server Hacks”的rcg,O'Reilly。它非常适合您想要的内容,并且可以突出显示不同颜色的多个表达。

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}

答案 7 :(得分:5)

我将此添加到我的.bash_aliases:

highlight() {
  grep --color -E "$1|\$"
}

答案 8 :(得分:2)

要在查看整个文件时突出显示模式,h可以执行此操作。

另外,它为不同的图案使用不同的颜色。

cat FILE | h 'PAT1' 'PAT2' ...

您还可以将h的输出传输到less -R以便更好地阅读。

要为每种模式设置grep并使用1种颜色,cxpgrep可能非常合适。

答案 9 :(得分:2)

grep的-z选项也很漂亮!

cat file1 | grep -z "pattern"

答案 10 :(得分:1)

另一个答案提到了grep的-Cn开关,它包含n行Context。我有时用n = 99做这个,作为一种快速而肮脏的方式,当egrep模式显得过于繁琐时,或者当我在一台我没有安装rcg的机器上时,至少获得一个完整的上下文和/或ccze。

我最近发现ccze是一种功能更强大的着色剂。我唯一的抱怨是它是面向屏幕的(如less,我从来没有因此而使用)除非你为“原始ANSI”输出指定-A开关。

上面提到的rcg +1。它仍然是我的最爱,因为在别名中自定义非常简单。像这样的东西通常在我的〜/ .bashrc:

alias tailc ='tail -f / my / app / log / file | rcg发送“BOLD GREEN”收到“CYAN”错误“RED”'

答案 11 :(得分:1)

另一种肮脏的方式:

grep -A80 -B80 --color FIND_THIS IN_FILE

我做了

alias grepa='grep -A80 -B80 --color'

在bashrc中。

答案 12 :(得分:1)

这是一个shell脚本,它使用Awk的gsub函数将正在搜索的文本替换为正确的转义序列,以鲜红色显示:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

像这样使用它:

$ ./cgrep pattern [file]

不幸的是,它没有grep的所有功能。

有关详细信息,请参阅Linux Journal

中的文章“So You Like Color

答案 13 :(得分:1)

好的,这是一种方式,

wc -l filename

会给你一个行数 - 比如说NN,然后就可以了

grep -C NN --color=always filename

答案 14 :(得分:1)

已经建议使用grep -E '|pattern',只是想澄清一下也可以突出显示整行。

例如tail -f /somelog | grep --color -E '| \[2].*'

答案 15 :(得分:0)

或者,您可以使用The Silver Searcher并执行

ag <search> --passthrough

答案 16 :(得分:0)

如果要突出显示不同颜色的多个图案,请参阅this bash脚本。

基本用法:

echo warn error debug info 10 nil | colog

您可以在按一个键的同时更改图案和颜色,然后输入键。

答案 17 :(得分:0)

出于类似的目的,我使用以下命令:

grep -C 100 searchtext file

这将表示grep在突出显示的搜索文本之前和之后打印100 * 2行上下文。

答案 18 :(得分:0)

这里的my approach受@kepkin解决方案的启发:

# Adds ANSI colors to matched terms, similar to grep --color but without
# filtering unmatched lines. Example:
#   noisy_command | highlight ERROR INFO
#
# Each argument is passed into sed as a matching pattern and matches are
# colored. Multiple arguments will use separate colors.
#
# Inspired by https://stackoverflow.com/a/25357856
highlight() {
  # color cycles from 0-5, (shifted 31-36), i.e. r,g,y,b,m,c
  local color=0 patterns=()
  for term in "$@"; do
    patterns+=("$(printf 's|%s|\e[%sm\\0\e[0m|g' "${term//|/\\|}" "$(( color+31 ))")")
    color=$(( (color+1) % 6 ))
  done
  sed -f <(printf '%s\n' "${patterns[@]}")
}

这接受多个参数(但不允许您自定义颜色)。示例:

$ noisy_command | highlight ERROR WARN

答案 19 :(得分:0)

有什么办法可以告诉grep打印正在读取的每一行 不管有没有比赛?

在没有显示所有上下文行的选项的情况下,

选项-C999将达到目的。大多数其他grep变体也支持此功能。但是:1)当没有找到匹配项时,不产生任何输出; 2)此选项对grep的效率产生负面影响:当-C值较大时,可能需要将许多行临时存储在内存中,以便grep确定发生匹配时要显示的上下文行。请注意,grep实现不加载输入文件,而是读取几行或在输入上方使用滑动窗口。上下文的“ before”部分必须保留在一个窗口(内存)中,以便在找到匹配项之后稍后输出“ before”上下文行。

诸如^|PATTERNPATTERN|$之类的模式,或者诸如[^ -~]?|PATTERN之类的任何空匹配子模式都是不错的技巧。但是,1)这些模式未显示突出显示为上下文的不匹配行,2)不能与其他grep选项(例如-F-w)结合使用。

所以这些方法都不令我满意。我正在使用ugrep和带有选项-y的增强型grep来将所有不匹配的输出有效地显示为颜色突出显示的上下文行。其他类似grep的工具(例如ag和ripgrep)也提供了传递选项。但是ugrep与GNU / BSD grep兼容,并提供grep选项的超集,例如-y-Q。例如,以下是-y-Q结合使用时显示的内容(用于输入模式的交互式查询UI):

ugrep -Q -y FILE ...

答案 20 :(得分:0)

这似乎是一个肮脏的黑客。

grep "^\|highlight1\|highlight2\|highlight3" filename

这意味着-匹配行(^)的开头或Highlight1或Highlight2或Highlight3。结果,即使在同一行中,您也将突出显示所有高亮*模式匹配项。

答案 21 :(得分:0)

使用 ripgrep,又名 rg:https://github.com/BurntSushi/ripgrep

rg --passthru...

颜色为默认值:

enter image description here

  rg -t tf -e  'key.*tfstate' -e dynamodb_table
       --passthru
       Print both matching and non-matching lines.

       Another way to achieve a similar effect is by modifying your pattern to
       match the empty string. 
       For example, if you are searching using rg foo then using 
       rg "^|foo" instead will emit every line in every file searched, but only
       occurrences of foo will be highlighted. 
       This flag enables the same behavior without needing to modify the pattern.

亵渎,理所当然,但 grep 已经自满了。

brew/apt/rpm/whatever install ripgrep

你永远不会回去。