Pertahankan pewarnaan setelah pemipaan grep ke grep

140

Ada pertanyaan simlar dalam Preserve ls coloring setelah grep'ing tetapi itu mengganggu saya bahwa jika Anda menyalurkan output grep berwarna ke grep lain bahwa pewarnaannya tidak dipertahankan.

Sebagai contoh grep --color WORD * | grep -v AVOIDtidak menjaga warna output pertama. Namun bagi saya ls | grep FILEmemang menjaga warnanya, mengapa bedanya?

Zitrax
sumber
2
Pertanyaan ini tampaknya di luar topik karena ini adalah tentang penggunaan perintah Unix, milik unix.stackexchange.com
Raptor

Jawaban:

162

grepterkadang menonaktifkan keluaran warna, misalnya saat menulis ke pipa. Anda dapat mengganti perilaku ini dengangrep --color=always

Baris perintah yang benar adalah

grep --color=always WORD * | grep -v AVOID

Ini sangat verbose, atau Anda bisa menambahkan baris

alias cgrep="grep --color=always"

untuk Anda .bashrcmisalnya dan gunakan cgrepsebagai grep berwarna. Ketika mendefinisikan ulang grepAnda mungkin mengalami masalah dengan skrip yang bergantung pada output spesifik grepdan tidak suka kode pelolosan ascii.

Otto Allmendinger
sumber
4
Solusi ini hanya berfungsi dalam keadaan beruntung tertentu. Lihat jawaban andersonvom di bawah ini.
Studog
Dalam kasus saya (Ubuntu) saya sudah alias grep. alias grep='grep --color=autojadi saya hanya perlu mengubah di ~/.bashrcmana itu didefinisikan di tempat pertama.
sobi3ch
Tidak berfungsi untuk saya - mirip dengan skenario ini stackoverflow.com/a/7640077/248616
Nam G VU
Ide kreatif yang bagus ini sederhana dan bekerja dengan stackoverflow.com/a/36288791/248616
Nam G VU
pertanyaannya adalah tentang bagaimana membuat grep kedua tidak menekan warna yang pertama. Ini bukan jawaban untuk itu.
johannes_lalala
74

Satu kata nasihat:

Saat menggunakan grep --color=always, string aktual yang diteruskan ke pipa berikutnya akan diubah. Ini dapat mengarah pada situasi berikut:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Meskipun opsi -ve '12'harus mengecualikan garis tengah, itu tidak akan terjadi karena ada karakter warna antara 1dan 2.

andersonvom
sumber
Jika Anda menggunakan --color=auto, maka itu harus mengambil fakta Anda memipangnya di tempat lain dan menekan warna sama sekali, tetapi itu agak mengalahkan tujuannya. Jika Anda masih menginginkan hasil yang berwarna, saya kira Anda bisa melihatnya lagi di pipa terakhir menggunakan --color.
andersonvom
2
Pada Mac OS X, setidaknya, mewarnai pada pipa terakhir seperti yang disarankan @andersonvom tidak berhasil. Tidak yakin mengapa; mungkin itu mewarnai pola yang dikecualikan? --color=alwaystidak bekerja, dengan, saya berasumsi, peringatan yang dinyatakan di atas.
user766353
3
Anda harus memiliki pola grep yang sama dua kali dalam ekspresi Anda. Saya baru saja menguji ini di mac: http://i.imgur.com/BhmwAlF.png
andersonvom
9

Cukup ulangi perintah grep yang sama di ujung pipa Anda.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

Alex
sumber
2
Tidakkah membalikkan perintah memberikan hasil yang sama? grep -v AVOID * | grep WORD
Brydon Gibson
@BrydonGibson mungkin, tetapi itu adalah contoh untuk menunjukkan bahwa ia bekerja untuk sejumlah perintah pipa
Alex