web-dev-qa-db-ja.com

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

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

ファイルtestfile

hello
there
my
friends

コマンド

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

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

hello #highlighted
there
my
friends
38
ewok

Color GREPを使用して一致したパターンのみを強調表示し、その他の方法で出力を変更しないようにするには:

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

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

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

38
bot779

オプションを追加-zからGNU grepコマンド:

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

以下

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

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

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

3
Noam Manos

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

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

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

シェルですでに--color=autoが構成されている可能性があります。次に、--color=alwaysを指定する必要はほとんどありません:

grep 'hello\|$'

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

egrep 'hello|$'
2
Marián Černý

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

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

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

greph foo bar.txt

cat bar.txt | greph foo
0
rpmohn