601

grep--color=alwaysフラグは非常に便利です。ただし、grep は一致する行のみを出力します (コンテキスト行を要求しない限り)。印刷される各行に一致があるとすれば、強調表示は可能な限り多くの機能を追加しません。

catファイルを開き、パターン マッチが強調表示されたファイル全体を表示したいと思います。

一致するかどうかに関係なく、読み取られているすべての行を印刷するようにgrepに指示できる方法はありますか? ファイルのすべての行で grep を実行するスクリプトを作成できることは知っていますが、標準でこれが可能かどうかに興味がありましたgrep

4

23 に答える 23

946

以下にいくつかの方法を示します。

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

|記号は OR 演算子です。を使用してエスケープするか、 -E を追加するか、 の代わりにコマンド\を使用して、検索テキストを正規表現として解釈する必要があることを grep に伝えます。egrepgrep

検索テキスト "pattern|$" は実際にはトリックでpatternあり、末尾のある OR 行を含む行に一致します。すべての行には終わりがあるため、すべての行が一致しますが、行の終わりは実際には文字ではないため、色付けされません。

色付きのパーツもパイプを介して渡すには (たとえば、 に向けて)、次lessのようにalwaysパラメーターを指定します--color

grep --color=always 'pattern\|$' file | less -r
grep --color=always -E 'pattern|$' file | less -r
egrep --color=always 'pattern|$' file | less -r
于 2009-06-11T15:30:58.197 に答える
110

ここに同じ線に沿ったものがあります。とにかく使用量が少なくなる可能性があるため、次のことを試してください。

less -p pattern file

パターンが強調表示され、ファイル内で最初に出現するパターンにジャンプします。

nで次の出現箇所に、 で前の出現箇所にジャンプできますp。で終了しqます。

于 2009-06-11T22:53:21.393 に答える
9

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
}
于 2009-06-29T06:08:10.597 に答える
7

これを .bash_aliases に追加しました:

highlight() {
  grep --color -E "$1|\$"
}
于 2015-03-13T07:46:35.420 に答える
1

別の汚い方法:

grep -A80 -B80 --color FIND_THIS IN_FILE

私はやった

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

.bashrc で。

于 2013-05-17T13:55:33.500 に答える
1

別の方法として、The Silver Searcherを使用して実行することもできます。

ag <search> --passthrough
于 2016-06-07T01:55:58.910 に答える
1

Here is a shell script that uses Awk's gsub function to replace the text you're searching for with the proper escape sequence to display it in bright red:

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

Use it like so:

$ ./cgrep pattern [file]

Unfortunately, it doesn't have all the functionality of grep.

For more information , you can refer to an article "So You Like Color" in Linux Journal

于 2009-06-11T15:38:03.843 に答える
1

別の回答では、n 行の Context を含む grep の -Cn スイッチについて言及されています。egrep パターンが面倒すぎるとき、または rcg をインストールしていないマシンを使用しているときに、[少なくとも] 画面いっぱいのコンテキストを取得する手っ取り早い方法として、n=99 でこれを行うことがあります。および/またはccze。

ccze私は最近、どちらがより強力なカラーライザーであるかを発見しました。less私の唯一の不満は、「生の ANSI」出力に -A スイッチを指定しない限り、画面指向 (その理由で決して使用しない など) であるということです。

rcg上記の言及に対して+1 。エイリアスでカスタマイズするのはとても簡単なので、今でも私のお気に入りです。通常、次のようなものが ~/.bashrc にあります。

エイリアス tailc='tail -f /my/app/log/file | rcg send "BOLD GREEN" receive "CYAN" error "RED"'

于 2012-04-11T22:20:20.257 に答える
0

わかりました、これは一方通行です。

wc -l filename

行数が表示されます -- NN と言うと、実行できます

grep -C NN --color=always filename
于 2009-06-11T15:30:24.670 に答える
0

複数のパターンを異なる色でハイライトしたい場合は、このbash スクリプトを参照してください。

基本的な使い方:

echo warn error debug info 10 nil | colog

1つのキーを押してからキーを入力して、実行中にパターンと色を変更できます。

于 2016-10-24T21:24:17.360 に答える
0

@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
于 2020-02-28T01:03:13.370 に答える