我发现grep的——color=always标志非常有用。但是,grep只打印匹配的行(除非您要求上下文行)。假设它打印的每一行都有一个匹配项,那么高亮显示并不能增加尽可能多的功能。

我真的想猫一个文件,并看到整个文件与模式匹配突出显示。

是否有某种方法可以告诉grep打印正在读取的每一行,而不管是否有匹配?我知道我可以编写一个脚本来在文件的每一行上运行grep,但我很好奇标准grep是否可以做到这一点。


当前回答

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

rg - passthru……

颜色是默认的:

  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.

亵渎神明,没错,但格雷普已经沾沾自喜了。

安装ripgrep

你再也回不去了。

其他回答

您也可以创建别名。在你的.bashrc(或osx上的.bash_profile)中添加这个函数

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

你现在可以这样使用别名:"ifconfig | grepe inet"或"grepe css index.html"。

(PS:别忘了源~/。在当前会话上重新加载Bashrc)

如果您想用不同的颜色突出显示几个模式,请参阅这个bash脚本。

基本用法:

echo warn error debug info 10 nil | colog

你可以改变图案和颜色,同时运行按一键,然后进入键。

另一个回答提到了grep的-Cn开关,其中包含n行Context。当egrep模式看起来太复杂,或者当我在一台没有安装rcg和/或ccze的机器上时,我有时会用n=99作为一种快速而肮脏的方式来获得[至少]满屏的上下文。

我最近发现ccze是一个更强大的着色剂。我唯一的抱怨是它是面向屏幕的(就像less一样,我从不使用这个原因),除非你为“原始ANSI”输出指定-A开关。

上面提到的RCG +1。它仍然是我的最爱,因为它是如此简单,自定义在一个别名。类似这样的东西通常在我的~/.bashrc中:

alias tailc='tail -f /my/app/log/file | rcg send "BOLD GREEN" receive "CYAN" error "RED"'

我想推荐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)),并且在搜索许多文件时具有更好的上下文显示。

这里有一些类似的东西。很有可能,无论如何你都会用得更少,所以试试这个:

less -p pattern file

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

你可以用n跳到下一个出现点,用p跳到前一个出现点,用q退出。