我发现grep
的--color=always
标志非常有用。但是,grep仅打印具有匹配项的行(除非您请求上下文行)。鉴于它打印的每一行都有一个匹配项,因此突出显示并没有添加尽可能多的功能。
我真的很想要cat
一个文件,然后看到整个文件都带有突出显示的模式匹配项。
有什么办法可以让grep打印正在读取的每一行,而不管是否有匹配项?我知道我可以编写一个脚本在文件的每一行上运行grep,但是我很好奇standard是否可以实现grep
。
我发现grep
的--color=always
标志非常有用。但是,grep仅打印具有匹配项的行(除非您请求上下文行)。鉴于它打印的每一行都有一个匹配项,因此突出显示并没有添加尽可能多的功能。
我真的很想要cat
一个文件,然后看到整个文件都带有突出显示的模式匹配项。
有什么办法可以让grep打印正在读取的每一行,而不管是否有匹配项?我知道我可以编写一个脚本在文件的每一行上运行grep,但是我很好奇standard是否可以实现grep
。
Answers:
以下是一些方法:
grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
egrep --color "pattern|" file
(信用stackoverflow.com/a/7398092/50979)
egrep --color "pattern1|pattern2|$"
。否则颜色突出显示不会发生。
这是一样的东西。很有可能,您无论如何都会减少使用,因此请尝试以下操作:
less -p pattern file
它将突出显示模式,并跳至文件中第一个出现的模式。
-
:… | less -p pattern -
-i
选项将使匹配大小写不敏感,如中所述less -ip pattern file
。
less
以下-R
开关:… | less -Rip introduction -
$ ack --color --passthru --pager =“ $ {PAGER:-less -R}”模式文件
$ ack --color --passthru模式文件| 少-R
$ export ACK_PAGER_COLOR =“ $ {PAGER:-less -R}” $ ack --passthru模式文件
我喜欢它,因为它默认为目录的递归搜索(并且比聪明得多grep -r
),支持完整的Perl正则表达式(而不是POSIXish regex(3)
),并且在搜索许多文件时具有更好的上下文显示。
ack
是聪明,但有时太聪明,它已排除的文件类型,该命中英寸
ack -a
将搜索所有的文件类型,同时还排除.git/
.svn/
等
ack
不会搜索我的图像,所以搜索-a
太多。我添加--type-set=freemarker=.ftl
了~/.ackrc
,举了一个例子。
您可以highlight
从https://github.com/kepkin/dev-shell-essentials使用我的脚本
这是更好的比grep
,因为你可以突出显示每场比赛有其自己的颜色。
$ command_here | highlight green "input" | highlight red "output"
grep
,这是运行* nix的计算机上的标准实用程序。
colout
另一个答案中提到的那么好。
colout
,如果您想检查它的作用,那么这很好。
您也可以创建一个别名。在您的.bashrc(或osx上的.bash_profile)中添加此功能
function grepe {
grep --color -E "$1|$" $2
}
您现在可以使用如下别名:“ ifconfig | grepe inet
”或“ grepe css index.html
”。
(PS:别忘source ~/.bashrc
了在当前会话上重新加载bashrc)
--color=always
代替--color
less
解释颜色代码less -R
。
使用colout
程序:http : //nojhan.github.io/colout/
它旨在向文本流中添加颜色突出显示。给定正则表达式和颜色(例如“红色”),它会复制文本流并突出显示匹配项。例如:
# 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
grep
,并且已经在答案中进行了扩展,则它是colout
解决您遇到的问题的最佳解决方案,也是我所知道的最佳解决方案。根据UNIX的哲学,程序应该写得很好。因为grep
它正在过滤文本流。因为colout
它是着色或突出显示文本流。
colout
是一种用途广泛的工具。一次学习,用它在许多情况下,而不是一个学习工具,亮点日志文件,另一个亮点测试输出等
我使用O'Reilly的“ Linux Server Hacks”中的rcg。它非常适合您想要的内容,并且可以突出显示具有不同颜色的多个表达式。
#!/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
}
好的,这是一种方法,
wc -l filename
将为您提供行数-说NN,那么您可以
grep -C NN --color=always filename
这是一个使用Awk的gsub函数将您要搜索的文本替换为正确的转义序列以将其显示为亮红色的shell脚本:
#! /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 ”。
另一个答案提到了grep的-Cn开关,其中包括n行上下文。有时,我会使用n = 99进行此操作,这是一种快速而又肮脏的方法,当egrep模式看起来过于杂乱,或者当我在未安装rcg的计算机上时,至少获得全屏的上下文和/或ccze。
我最近发现ccze
这是一种功能更强大的着色剂。我唯一的抱怨是它是面向屏幕的(例如less
,出于这个原因我从不使用),除非您为“原始ANSI”输出指定-A开关。
rcg
上面提到的+1 。仍然是我的最爱,因为在别名中自定义非常简单。这样的东西通常在我的〜/ .bashrc中:
别名tailc ='tail -f / my / app / log / file | rcg发送“ BOLD GREEN”收到“ CYAN”错误“ RED”'
另一种肮脏的方式:
grep -A80 -B80 --color FIND_THIS IN_FILE
我做了一个
alias grepa='grep -A80 -B80 --color'
在bashrc中。
或者,您可以使用Silver Searcher并执行
ag <search> --passthrough
这是我的方法,灵感来自@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
有什么办法可以告诉grep打印正在读取的每一行,而不管是否有匹配项?
选件-C999
会做的伎俩在没有选项来显示所有上下文行。大多数其他grep变体也支持此功能。但是:1)当没有找到匹配项时,不产生任何输出; 2)此选项对grep的效率产生负面影响:当该-C
值较大时,可能必须将许多行临时存储在内存中,以便grep确定上下文的哪几行在发生匹配时显示。请注意,grep实现不加载输入文件,而是读取几行或在输入上方使用滑动窗口。必须将上下文的“之前”部分保存在一个窗口(内存)中,以便在找到匹配项之后稍后输出“之前”的上下文行。
诸如^|PATTERN
或PATTERN|$
或任何空匹配子模式之类的模式[^ -~]?|PATTERN
是一个不错的技巧。但是,1)这些模式没有显示突出显示为上下文的不匹配行,2)不能与其他grep选项(例如-F
和)结合使用-w
。
因此,这些方法都不令我满意。我正在使用ugrep,并使用带有选项的增强型grep -y
来有效地将所有不匹配的输出显示为颜色突出显示的上下文行。其他类似grep的工具(例如ag和ripgrep)也提供了传递选项。但是ugrep与GNU / BSD grep兼容,并提供了grep选项的超集,例如-y
和-Q
。例如,以下选项-y
与结合使用时将显示什么选项-Q
(交互式查询UI以输入模式):
ugrep -Q -y FILE ...
sed
。该sed
解决方案以增加复杂性为代价为您提供了多种颜色(而不是大约30个字符,而您拥有大约60个字符)。