grep:2つのキーワードを色付けする方法は?


12

1つのコマンドを使用して2つのキーワードをgrepする方法は知っていますが、outputでそのうちの1つにしか色を付けることができません。私のコマンドは次のとおりです。

grep 'keyword1' file.log | grep 'keyword2'

のみkeyword2が強調表示されます。keyword1同時に強調表示するにはどうすればよいですか?

回答:


15

このgrepコマンドは--color=alwaysオプションを受け入れるため、使用できます

grep 'keyword1' file.log --color=always | grep 'keyword2'

以下のようgertvdijkポイントうち、このコマンドは非効率的かもしれないが、それはKEYWORD1とKEYWORD2の両方を含むすべての行を探します。異なる色で強調表示する場合は、使用できます

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

keyword2を青で強調表示します。このmt部分は、grepこのCSIコードを使用して一致するテキストを強調表示することを01;34意味し、「通常の背景に太字の青い前景」を意味します。


1
ユースケースの詳細な説明とカスタマイズオプションについては+1!
gertvdijk

おかしい、私がこれを試してみると:grep -R --color = always keyword1。| grep keyword2 //最初のキーワードのみが強調表示されます。再帰検索で動作するように回答を適応するにはどうすればよいですか?
TenLeftFingers

1
それは奇妙です、動作するgrep -R --color=always keyword1 . | grep keyword2はずです。出力を再度リダイレクトしていますか(2番目grepをにパイプするなどless -R)?その場合--color=always、2番目にも追加する必要があります。
ダニエルH

素晴らしい答えです!両方を強調するには、の直後の--color=autoにが必要になります。grep'keyword2'
ルイス

@Luisええ、Grepがデフォルトで色なしになることは少なくありません(それは設定時のオプションかもしれませんが、2013年にそれなしでマシンで動作したときにオーバーライドされたとは思いません...)。--color=alwaysあなたがそれをパイプするlessか何かにしたいかもしれないので、答えに追加しました。
ダニエルH

3

の別のインスタンスにパイプするのではなく、実際の正規表現を試してくださいgrep。例:

grep -E "\<foo\>.*\<bar\>" file

残念ながら、これはキーワードがこの順序でのみ一致する一致する行に制限されます。とにかく、grepあなたの質問での使用はかなり非効率的であり、あなたはそれを避けるべきです。おそらく、@ DanielH答えは、あなたの場合にはかなり簡単です。

キーワードの「または」マッチングには、これを定期的に使用します。

grep -E "(foo|bar)" file

1
OPは両方のキーワードを含む行のみを必要としていると思います(指定したコマンドは、どちらかを含むすべての行を提供します)。
ダニエルH

@DanielHそれを指摘してくれてありがとう。回答を更新しました。
gertvdijk

fooがbarの前に来る場合にのみ機能しませんか?より良い方法がfoo.*bar|bar.*fooあるのか、それともこの場合に必要なのかはわかりません(おそらく、キーワードの標準的な順序を持つログファイルのようです)。更新する前に答えを追加しましたが、連鎖grepsが本当に必要な場合(またはのように、色付きの出力を端末に送信すべきでない場合grep | less -R)に備えて、それを保持します。
ダニエルH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.