我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。
我真的想猫一个文件,并看到整个文件与模式匹配突出显示。
是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。
当前回答
我想推荐ack——它比grep更好,是程序员的强大搜索工具。
$ 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正则表达式(3)),并且在搜索许多文件时具有更好的上下文显示。
其他回答
我想推荐ack——它比grep更好,是程序员的强大搜索工具。
$ 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正则表达式(3)),并且在搜索许多文件时具有更好的上下文显示。
另一种肮脏的方式:
grep -A80 -B80 --color FIND_THIS IN_FILE
我做了一个
alias grepa='grep -A80 -B80 --color'
把bashrc打印出来。
是否有某种方法可以告诉grep打印正在读取的每一行 不管是否匹配?
Option -C999 will do the trick in the absence of an option to display all context lines. Most other grep variants support this too. However: 1) no output is produced when no match is found and 2) this option has a negative impact on grep's efficiency: when the -C value is large this many lines may have to be temporarily stored in memory for grep to determine which lines of context to display when a match occurs. Note that grep implementations do not load input files but rather reads a few lines or use a sliding window over the input. The "before part" of the context has to be kept in a window (memory) to output the "before" context lines later when a match is found.
模式,如^| pattern或pattern |$或任何空匹配的子模式,如[^ -~]?|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 ...
如果您想用不同的颜色突出显示几个模式,请参阅这个bash脚本。
基本用法:
echo warn error debug info 10 nil | colog
你可以改变图案和颜色,同时运行按一键,然后进入键。
这里有一些方法:
grep --color 'pattern\|$' file
grep --color -E 'pattern|$' file
egrep --color 'pattern|$' file
|符号是OR运算符。要么使用\转义它,要么通过添加-E或使用egrep命令而不是grep告诉grep搜索文本必须解释为正则表达式。
搜索文本“pattern|$”实际上是一个技巧,它将匹配具有模式的行或具有结束的行。因为所有的行都有一个结尾,所有的行都被匹配,但是一行的结尾实际上不是任何字符,所以它不会被着色。
要通过管道传递有颜色的部分,例如向less传递,请向——color提供always参数:
grep --color=always 'pattern\|$' file | less -r
grep --color=always -E 'pattern|$' file | less -r
egrep --color=always 'pattern|$' file | less -r