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


39

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

ファイルtestfile

hello
there
my
friends

コマンド

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

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

hello #highlighted
there
my
friends

回答:


38

Color GREPを使用して、一致したパターンのみを強調表示し、それ以外の場合は出力を変更しない場合:

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

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

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


kubectl apply -k . | grep --color=always -e "^" -e "configured"zshのkubectl で動作します
Michael Cole

Bashで使用する場合:highlight(){grep --color = always -e "^" -e $ *; }
Jon

これはFreeBSDでも動作します。最初と2番目のパターンを交換するだけです(2番目に"^"する必要があります)。
マリアンチェルニー

25

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

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

以下

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

3
これは非常に粗雑なハックです。ファイル全体を1行として扱う効果があります。ファイルが非常に大きい場合、ファイルは、パターンが含まれていない場合は、したがって、(1)は、メモリ不足の可能性、および(2)が存在し得る全てでは、何も出力されません。
G-Manは 'Reinstate Monica'

これはどのバージョンのgrepでサポートされていますか?grep 2.5.4では、-zが利用できないようです...
Alex

@Alex:GNU grepバージョン2.6.3を使用しました。
Cyrus

2
@ G-Man:より多くのリソースを節約:grep --color "hello\|$" file
Cyrus

@サイラス:はい、それはより良い答えです。残念ながら、これはこの質問に対するbot779の回答と本質的に同等であり、私がリンクした質問に対する受け入れられた回答(1および2)とほぼ同じです。
G-Manは 'Reinstate Monica'を

4

前の回答と同様に、すべての$行末をキャッチできます。

cat testfile | grep --color -E "hello|$"

-E(または--extended-regexp)は、特殊文字をでエスケープする必要があることを意味し\ます。使用する場合、|正規表現「OR」条件として扱われます。

Grep |$はまた、末尾があるすべての行をキャッチして印刷しますが、$は非表示文字であるため、強調表示できません。

更新:

すべての出力を出力するだけでなく、一致が見つかったかどうかに関係なく終了コードも返したい場合は、perlコマンドを使用できます。

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

sedを使用する場合- すべての一致強調表示する方法の例+一致が見つからない場合に終了コードを返すhttps : //askubuntu.com/a/1200851/670392


2

これは、GNU grepおよびFreeBSDのgrepで動作します。

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

これは、テキスト「hello」または(\|)各行の終わりにある印刷不可能なnull文字列()と一致します$。そのため、各行が出力されますが、「hello」だけが強調表示されます。

おそらくあなた--color=autoはあなたのシェルですでに設定されているでしょう。次に、おそらく指定する必要はありません--color=always

grep 'hello\|$'

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

egrep 'hello|$'

これは、すべての入力行を表示する方法には答えません。
クリスページ

@ChrisPage私はそうだと思います:それが各行が出力される理由ですが、「hello」だけが強調表示されます。
マリアンチェルニー

0

上記のトップアンサーに追加。コメントに記載されているhighlight {}関数は、データがパイプされている場合にのみ機能します。次のエイリアスは完全ではありませんが、より便利です。

alias greph="grep --color=always -e^ -e"

これは次のようなコマンドで機能します。

greph foo bar.txt

cat bar.txt | greph foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.