すべての出力を表示し、検索一致を強調表示します

すべての出力を表示し、検索一致を強調表示します

bashでは、コマンドを実行して特定のパターンに一致する出力行のみを表示したい場合は、grep次のようにパイプすることができます。

ファイルテストファイル

hello
there
my
friends

指示

$ cat testfile | grep 'hello'
hello #this will be highlightd

これにより、検索一致が強調表示され、該当する行全体が表示されます。 と を使用して、その行の前後の行を表示できます-A-B私の質問は、コマンドを実行してすべての出力を通常どおりに表示しながら、grepのように検索一致を強調表示することは可能でしょうか? つまり、私の出力は次のようになります。

hello #highlighted
there
my
friends

答え1

カラー GREP を使用して、一致したパターンのみを強調表示し、出力を変更しないようにするには、次の手順を実行します。

grep --color=always -e "^" -e "hello" testfile

最初のパターンはすべての行に一致します (すべての行が印刷されます)。2 番目のパターン (および後続のパターン) により、一致したテキストが色で強調表示されます。

最初のパターンはすべての行に一致しますが、印刷可能な文字には一致しないため、色の強調表示は追加されず、強調表示されたテキストの読みやすさと競合したり妨げたりすることはありません。

答え2

-zGNU grep コマンドにオプションを追加します:

cat testfile | grep --color=always -z 'hello'

またはそれ以下

grep --color=always -z 'hello' testfile

答え3

これは、FreeBSD 上の grep だけでなく、GNU grep でも動作します。

grep --color=always 'hello\|$'

これは、テキスト「hello」または\|各行末の印刷できないヌル文字列( )と一致します$。各行が印刷されますが、「hello」のみが強調表示されるのはそのためです。

おそらく、すでに--color=autoシェルで設定されています。その場合、以下を指定する必要はほとんどありません--color=always

grep 'hello\|$'

egrep拡張正規表現を使用して、よりシンプルなバージョンを作成することもできます。この場合|、「or」式をエスケープする必要はありません。

egrep 'hello|$'

StackOverflow の同様の質問も参照してください:色分けされた grep -- 一致箇所を強調表示してファイル全体を表示する

答え4

ripgrep以下は、 の現代的で、使いやすく (私見では)、はるかに高速な代替手段である を使用したソリューションですgrep

cat my-file | rg --passthru '<REGEX>'

「蛍光ペンの色」も簡単にカスタマイズできます。

# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'

見るman rgオンライン版)。


日常使用のために、シェル エイリアスを作成しました。

# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'

今では、 と同じくらい簡単ですcat my-file | hl '<REGEX>'

関連情報