色付けされたgrep —ファイル全体をハイライトされた一致で表示


509

私は見つけるgrep--color=alwaysフラグは途方もなく有用であること。ただし、grepは一致する行のみを出力します(コンテキスト行を要求しない限り)。印刷する各行に一致があるとすると、強調表示によって機能が追加されません。

私は本当にcatファイルが好きで、パターンマッチが強調表示されたファイル全体を見たいです。

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


1
複数のパターン(つまり、エラー、警告、情報などのメッセージ)に複数の色が必要な場合は、を使用しますsed。このsedソリューションでは、複雑さが増す代わりに複数の色が得られます(約30文字ではなく約60文字になります)。
Trevor Boyd Smith

ではsedのあなたもすることができます+リターン終了コードをハイライト表示し、例を参照してください。 askubuntu.com/a/1200851/670392
ノーム・マノス

回答:


797

いくつかの方法があります:

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

152
その| $トリックは素晴らしいです!よくできました。覚えておく必要があります。正規表現に精通していない場合、「パターン| $」は、検索しているパターンのある行と、末尾のある行、つまりすべての行に一致します。行の終わりは実際には文字ではないので、出力の色分けされた部分は単にパターンになります。ライアン、ありがとう!
zslayton 2009年

55
また、「$」を省略することができますegrep --color "pattern|" file(クレジットstackoverflow.com/a/7398092/50979
13ren

15
@Zack、「|」演算子はAND演算子ではなく、OR演算子です
JBoy

16
@JBoy、私はブール論理の方法ではなく、従来の英語の方法で「AND」を使用していました。あなたは正しいです、それは確かに「or」演算子です-これはこれと一致します。:P明確化。
zslayton 2013

12
複数のパターンに一致する場合は「$」が必要なようです。egrep --color "pattern1|pattern2|$"。それ以外の場合、色の強調表示は行われません。
ZaSter 2013

91

これは同じ線に沿ったものです。とにかく使用量が少なくなるので、これを試してください:

less -p pattern file

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


4
また、配管(stdingからの読み取り)を使用して動作します-… | less -p pattern -
PHK

3
@phk:ダッシュも省略できます。
追って通知があるまで一時停止。

また、-iオプションを追加すると、のように一致の大文字と小文字が区別されなくなりless -ip pattern fileます。
steveb

...とANSI-色の入力に配管する場合は、提供lessして-Rスイッチ:… | less -Rip introduction -
Abdull

48

私はackをお勧めします-プログラマ向けの強力な検索ツールであるgrepより優れています

$ ack --color --passthru --pager = "$ {PAGER:-less -R}"パターンファイル
$ ack --color --passthruパターンファイル| より少ない-R
$エクスポートACK_PAGER_COLOR = "$ {PAGER:-less -R}"
$ ack-パススルーパターンファイル

デフォルトでディレクトリの再帰的な検索になり(そしてよりもはるかに賢くgrep -r)、(POSIXishではなく)完全なPerl正規表現をサポートしregex(3)、多くのファイルを検索するときのコンテキスト表示がはるかに優れているので、私はそれが好きです。


2
しかし、時々、それがそこにあるに違いないと確信しているとき、それは時々私が欲しいものを見つけません。ackスマート、時にはあまりにもスマート、そしてそれがヒットしていたことを、ファイルの種類をexludedである。
マイケルPiefel

4
@MPiはack -aまだ除外しつつ、すべての種類のファイルを検索します.git/ .svn/など
ephemient

1
しかし、ack私の画像を検索しないのはクールなので、-a多すぎます。例として、にを追加--type-set=freemarker=.ftlしました~/.ackrc
Michael Piefel

3
いくつかの設定の微調整により、grepはすでにackが行うすべてのことを実行し、より高速で、ackのホワイトリストが時々行うような結果を決して省略しません。おそらく、希望のgrep設定を.bashrcに保存します。鉱山は読み取ります:function grp(){GREP_OPTIONS = "-rI --color --exclude-dir = \。git --exclude = tags" grep "$ @"
Jonathan Hartley

22

https://github.com/kepkin/dev-shell-essentialshighlightから私のスクリプトを使用できます

それぞれの一致を独自の色で強調表示できるので、それより優れgrepいます。

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

Githubプロジェクトのスクリーンショット


3
この質問grepは、* nixを実行しているマシンの標準ユーティリティであるを使用した解決策を明確に求めています。
zslayton 2014

1
このスクリプトは優れていますがcolout、別の回答で述べられているほど優れていません。
Jonathan Hartley

@JonathanHartleyそして、なぜそうなのですか?その理由はわかりません。さらに、このスクリプトはよりもはるかに単純な実装を使用しcoloutています。これは、それが何をするのかを調べたい場合に適しています。
HelloGoodbye

@HelloGoodbyeそうだね。判決は控えるべきだ。coloutはより徹底的で強力ですが、それに応じて使用やリバースエンジニアリングが複雑になることは間違いありません。
ジョナサンハートレイ

@JonathanHartleyそれはより強力であることは理にかなっています!
HelloGoodbye

19

エイリアスを作成することもできます。この関数を.bashrc(またはosxの.bash_profile)に追加します

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

これで、「ifconfig | grepe inet」または「grepe css index.html」のようなエイリアスを使用できます。

(PS:source ~/.bashrc現在のセッションでbashrcをリロードすることを忘れないでください)


システムで使用可能な場合は、egrepを使用することもできます。
トム

1
この結果をパイピングすると、カラー情報が失われなくなります。それをどのように防ぐことができますか?
Connor Clark

5
@Hotenの--color=always代わりに使用--color
limp_chimp

3
また、lessカラーコードを解釈させるには、を使用しますless -R
Eliah Kagan

引用符で囲まれていない$ 2の使用は、ブランクセーフではありません。私はbashではむしろ関数grepe()を実行したいと思います。
Robert Klemme

16

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

1
他の場所で述べたように、質問は、grepを使用するソリューションを明確に求めました。これは、* nixを実行しているマシンの標準ユーティリティです。
zslayton 2015年

4
@ザック大丈夫、ごめんなさい。実際、あなたが問題をを超えgrepて拡張し、それがすでに回答で拡張されている場合、それはcoloutあなたが抱えていた問題の最善の解決策であり、私が認識している最高のものです。UNIXの哲学によれば、プログラムは1つのことをうまく実行するように作成する必要があります。以下のためgrepには、テキストストリームをフィルタリングしています。以下のためにcoloutそれ彩色やテキストストリームを強調しています。
user2683246 2015年

これは、複数の異なる色のハイライトを適用できるため、最良の答えcoloutです。このようなツールは、非常に便利です。むしろ、ハイライトのログファイル、別のハイライトにテスト出力などへの1つのツール学習よりも、多くの状況でそれを使用し、一度それを学ぶ
ジョナサン・ハートリーの

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
}

7

-zgrep のオプションもかなり洗練されています!

cat file1 | grep -z "pattern"

これは何ですか -zは、行区切り文字としてASCII NULを使用するようにgrepに指示します...
vy32 '31

6

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

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

3

ファイル全体を表示しながらパターンを強調表示するには、hを使用します。

さらに、パターンごとに異なる色を使用しています。

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

あなたもすることができ、パイプの出力hへのless -Rより良い読書のため。

パターンごとに1色をgrepして使用するには、cxpgrepが適しています。


1

これは一方向です

wc -l filename

行数が表示されます-NNと言ってください

grep -C NN --color=always filename

3
「-C 2147483647」を最初にwcにしたくない場合。ここで大きな数を使用しても、処理が遅くなるようには見えません。
バリーカーター2015

1

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」を参照してください。


1

他の1つの答えは、n行のコンテキストを含むgrepの-Cnスイッチについて述べています。egrepパターンがあまりにも手ごわいようであるとき、またはrcgをインストールしていないマシン上にいるときに、[少なくとも]画面いっぱいのコンテキストを取得する迅速で汚い方法として、n = 99でこれをときどき行いますおよび/またはccze。

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

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

エイリアスtailc = 'tail -f / my / app / log / file | rcg送信 "BOLD GREEN"受信 "CYAN"エラー "RED" '


1

別の汚い方法:

grep -A80 -B80 --color FIND_THIS IN_FILE

私はした

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

bashrcで。


1
あなたが探しているものがそこにない場合、これは問題があります。エラーが発生した場合は、何も表示されません。
ポールルーベル2013


0

異なる色でいくつかのパターンを強調表示したい場合は、これを参照してください bashスクリプトを。

基本的な使い方:

echo warn error debug info 10 nil | colog

1つのキーを押してからEnterキーを押すと、パターンと色を変更できます。


0

同様の目的で次のコマンドを使用します。

grep -C 100 searchtext file

これは、強調表示された検索テキストの前後に100 * 2行のコンテキストを印刷するようにgrepと指示します。


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

-1

一致があるかどうかに関係なく、読み取られているすべての行を印刷するようにgrepに指示できる方法はありますか?

オプション-C999は、すべてのコンテキスト行を表示するオプションがない場合に役立ちます。他のほとんどのgrepバリアントもこれをサポートしています。ただし、1)一致が見つからない場合、出力は生成されません。2)このオプションは、grepの効率に悪影響を及ぼし-Cます。値が大きい場合、コンテキストのどの行を特定するために、grepがこの行をメモリに一時的に保存する必要がある場合があります。一致が発生したときに表示します。grep実装は入力ファイルをロードせず、数行を読み取るか、入力上でスライディングウィンドウを使用することに注意してください。コンテキストの「前の部分」をウィンドウ(メモリ)に保持して、一致が見つかったときに「前の」コンテキスト行を後で出力する必要があります。

^|PATTERNまたはなどのパターンのPATTERN|$空の一致するサブパターンは、そのような問題のため[^ -~]?|PATTERNの素晴らしいトリックです。ただし、1)これらのパターンでは、一致しない行がコンテキストとしてハイライト表示されず、2)-Fおよびなどの他のgrepオプションと組み合わせて使用​​できません。-w、例えば。

したがって、これらのアプローチはどれも私には満足できません。私はugrepを使用し、オプションで拡張されたgrepを使用して、-y一致しないすべての出力を色で強調表示されたコンテキスト行として効率的に表示します。agやripgrepなどの他のgrepのようなツールもパススルーオプションを提供します。しかしugrepは、GNU / BSDのはgrepや特典などのgrepのオプションのスーパーセットと互換性があります-y-Q。たとえば、(インタラクティブクエリUIを入力してパターンを入力する)-yと組み合わせると、次のオプションが表示され-Qます。

ugrep -Q -y FILE ...

コメントを残さずにこれに投票するのはなぜですか?他の回答と同じように、代替のgrepツールについて言及するのは公平です。
アレックスRE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.