web-dev-qa-db-ja.com

grepに似たテキストをハイライトしますが、テキストを除外しません

Grepを使用すると、正規表現に一致する行のテキストが強調表示されます。

この動作が必要なのに、grepですべての行を出力した場合はどうなりますか? grepのmanページをざっと見てから、空っぽになりました。

232
Martin Konecny

Ackを使用します。ここで--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が使用されることに注意してください。このフラグは必要ない場合があります)。

232
holygeek

すべての行が一致することを確認できますが、無関係な一致を強調表示するものはありません

egrep --color 'Apple|' test.txt 

注:

  • egrepのスペルもgrep -Eです
  • --colorは通常、ほとんどのディストリビューションでデフォルトです
  • grepの一部のバリアントは、空の一致を「最適化」するため、代わりに「Apple | $」を使用できます(参照: https://stackoverflow.com/a/13979036/939457
89
Sorin

編集:

これはOS X Mountain Lionのgrepで動作します:

grep --color -E 'pattern1|pattern2|$'

代替の'^|pattern1|pattern2'部分は行の先頭で一致するのに対し、^は行の末尾で一致するため、これは$よりも優れています。いくつかの 正規表現エンジンpattern1またはpattern2を強調表示しません。これは^がすでに一致しており、エンジンがeagerであるためです。

'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は、Mac OS X Mountain LionでBSDスタイルのgrepによって挿入された余分な--行を、連続した一致のコンテキストが重複する場合でも削除します。

コンテキストが重複する場合、GNU grepが--行を省略したと思っていましたが、しばらくしていたので、間違っていることを覚えているかもしれません。

32
willkil

https://github.com/kepkin/dev-Shell-essentials のmyhighlightスクリプトを使用できます

Grepよりもbetterであるため、各一致を強調表示できるown color

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

enter image description here

27
kepkin

マッチを強調表示したいので、これはおそらく(たとえば、別のプログラムへのパイピングとは対照的に)人間が消費するためのものなので、ニースの解決策は以下を使用することです。

less -p <your-pattern> <your-file>

また、大文字と小文字の区別を気にしない場合:

less -i -p <your-pattern> <your-file>

これには、ページがあるという利点もあります。これは、長い出力を処理する必要がある場合に便利です。

15
acros

次の方法でgrepのみを使用して実行できます。

  1. ファイルを1行ずつ読み取る
  2. 各行のパターンを照合し、grepでパターンを強調表示する
  3. 一致しない場合は、行をそのままエコーします

次のことができます。

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile
4
jackhab

「すべての」行を印刷したい場合、簡単な解決策があります。

grep "test" -A 9999999 -B 9999999
  • A =>後
  • B =>前
2
Leon X. W.

検索でより多くのコンテキストが必要なためにこれを行っている場合、これを行うことができます:

cat BIG_FILE.txt | less

lessで検索を行うと、検索語が強調表示されます。

または、お気に入りのエディターに出力をパイプします。 1つの例

cat BIG_FILE.txt | vim -

次に、検索/ハイライト/置換。

0
dgo.a