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

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.


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

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


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|$'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.