アックを使用します。その --passthru をチェックアウトします ここのオプション:ack.完全な perl 正規表現を許可するという追加の利点があります。
$ ack --passthru 'pattern1' file_name
$ command_here | ack --passthru 'pattern1'
次のように grep を使用して実行することもできます:
$ grep --color -E '^|pattern1|pattern2' file_name
$ command_here | grep --color -E '^|pattern1|pattern2'
これにより、すべての行が一致し、パターンが強調表示されます。 ^ すべての行頭に一致しますが、文字ではないため、印刷/強調表示されません。
(ほとんどのセットアップではデフォルトで --color が使用されることに注意してください。そのフラグは必要ない場合があります)。
すべての行が一致していることを確認できますが、無関係な一致で強調表示するものはありません
egrep --color 'apple|' test.txt
注:
egrepgrep -Eと綴ることもできます--color通常、ほとんどのディストリビューションでデフォルトです- grep の一部のバリアントは空の一致を「最適化」するため、代わりに「apple|$」を使用することをお勧めします (https://stackoverflow.com/a/13979036/939457 を参照)
編集:
これは、OS X Mountain Lion の grep で動作します:
grep --color -E 'pattern1|pattern2|$'
これは '^|pattern1|pattern2' よりも優れています なぜなら ^ $ が 行末に一致します。一部の正規表現エンジンは pattern1 を強調表示しません または pattern2 なぜなら ^ すでに一致しており、エンジンは熱心です .
'pattern1|pattern2|' でも同様のことが起こります 正規表現エンジンは、パターン文字列の末尾にある空の代替が対象文字列の先頭と一致することに気付くためです.
[1]: http://www.regular-expressions.info/engine.html
最初の編集:
最終的に perl を使用しました:
perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'
これは、ANSI 互換の端末を持っていることを前提としています。
元の回答:
奇妙な grep に行き詰まっている場合 、これはうまくいくかもしれません:
grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'
数を調整して、必要なすべての行を取得します。
2 番目の grep 不要な -- を削除するだけです BSD スタイルの grep によって挿入された行 Mac OS X Mountain Lion では、連続した一致のコンテキストが重なっている場合でも。
GNU grep が -- を省略したと思った 文脈が重なったときの行ですが、かなり前なので記憶違いかもしれません.