grep: tampilkan semua output tetapi sorot kecocokan pencarian

39

di bash, jika saya ingin mengeksekusi perintah dan hanya menampilkan garis output yang cocok dengan pola tertentu, saya bisa mengirimnya ke pipa grep, seperti

file testfile

hello
there
my
friends

perintah

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

ini akan menyoroti kecocokan pencarian dan menampilkan seluruh baris yang dituju. Saya bisa menggunakan -Adan -Bmenampilkan garis sebelum dan sesudah garis itu. Pertanyaan saya, mungkinkah menjalankan perintah dan menampilkan semua output seperti biasa, tetapi untuk menyorot hasil pencarian seperti yang dilakukan grep? jadi ouput saya akan menjadi

hello #highlighted
there
my
friends
ewok
sumber
3
Lihat Yakinkan grep untuk menampilkan semua baris, bukan hanya yang cocok (U&L) atau Grep berwarna - melihat seluruh file dengan kecocokan yang disorot (Stack Overflow) untuk jawaban yang lebih baik.
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

38

Untuk menggunakan GREP Warna untuk hanya menyoroti pola yang cocok tetapi tidak mengubah output:

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

Pola pertama akan cocok dengan semua baris (semua baris akan dicetak) pola kedua (dan semua pola berikut) menyebabkan teks yang cocok disorot dalam warna.

Karena pola pertama cocok dengan semua baris tetapi tidak cocok dengan karakter yang dapat dicetak, itu tidak menambah highlight warna sehingga tidak bersaing / mengganggu pembacaan teks yang disorot.

bot779
sumber
Bekerja dengan kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"di zsh
Michael Cole
Untuk digunakan di Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon
Ini berfungsi pada FreeBSD juga, Anda hanya perlu menukar pola pertama dan kedua ( "^"harus kedua).
Marián Černý
25

Tambahkan opsi -zke perintah grep GNU Anda:

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

atau lebih pendek

grep --color=always -z 'hello' testfile
Cyrus
sumber
3
Ini adalah retasan yang sangat kasar. Ini memiliki efek memperlakukan seluruh file sebagai satu baris. Oleh karena itu, (1) jika file sangat besar, mungkin ada kemungkinan kehabisan memori, dan (2) jika file tidak mengandung pola sama sekali , maka tidak ada yang akan dihasilkan.
G-Man Mengatakan 'Reinstate Monica'
Versi grep apa yang didukung ini? Pada grep 2.5.4, -z sepertinya tidak tersedia ...
Alex
@Alex: Saya menggunakan GNU grep versi 2.6.3.
Cyrus
2
@ G-Man: lebih hemat sumber daya:grep --color "hello\|$" file
Cyrus
@Cyrus: Ya, itu jawaban yang lebih baik. Sayangnya, ini pada dasarnya setara dengan jawaban bot779 untuk pertanyaan ini, dan hampir identik dengan jawaban yang diterima ( 1 dan 2 ) untuk pertanyaan yang saya tautkan.
G-Man Mengatakan 'Reinstate Monica'
4

Demikian pula dengan jawaban sebelumnya, Anda dapat menangkap semua $ujung baris:

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

-E(atau --extended-regexp) berarti bahwa karakter khusus harus dihindari \. Saat menggunakannya, |akan diperlakukan sebagai kondisi regex "ATAU".

Grep |$juga akan menangkap dan mencetak semua baris yang memiliki akhir, tetapi karena $ adalah karakter tersembunyi, itu tidak dapat disorot.

Memperbarui:

Jika Anda ingin mencetak semua output, tetapi juga mengembalikan kode keluar , apakah kecocokan ditemukan atau tidak, Anda dapat menggunakan perintah perl:

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

Jika Anda lebih suka sed - Berikut ini contoh cara menyorot semua pertandingan + mengembalikan kode keluar jika tidak ada yang cocok: https://askubuntu.com/a/1200851/670392

Noam Manos
sumber
2

Ini berfungsi dengan grep GNU dan grep di FreeBSD:

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

Ini cocok dengan teks "halo" atau ( \|) string null yang tidak dapat dicetak pada akhir setiap baris ( $). Itu sebabnya setiap baris dicetak tetapi hanya "halo" yang disorot.

Kemungkinan Anda sudah --color=automengkonfigurasi di shell Anda. Maka Anda kemungkinan besar tidak perlu menentukan --color=always:

grep 'hello\|$'

Anda juga dapat menyederhanakan versi dengan menggunakan egrep(dengan ekspresi reguler yang diperluas), di mana |untuk ekspresi "atau" tidak perlu diloloskan:

egrep 'hello|$'
Marián Černý
sumber
Ini tidak menjawab bagaimana menampilkan semua jalur input.
Chris Page
@ ChrisPage Saya akan mengatakannya: Itu sebabnya setiap baris dicetak tetapi hanya "halo" yang disorot.
Marián Černý
0

Menambah jawaban teratas di atas. Fungsi highlight {} yang disebutkan dalam komentar hanya berfungsi ketika data disalurkan ke dalamnya. Alias ​​berikut, meskipun tidak sempurna, lebih bermanfaat:

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

Ini berfungsi dengan perintah seperti:

greph foo bar.txt

cat bar.txt | greph foo
rpm
sumber