Bagaimana saya bisa menyimpan kode warna dengan input grep?

15

Jika saya menggunakan dua grepperintah berurutan , misalnya:

echo "foo bar" | grep foo | grep bar

Maka pola pertama ("foo") tidak disorot. Bahkan, tampaknya grep menghapus kode warna dari inputnya. Apakah ada cara untuk mencegah hal ini?

Chris2048
sumber
Pertanyaan lain dengan jawaban yang sama: bagaimana Anda bisa mengembalikan keluaran berwarna ke grep dalam fungsi bash?
Camille Goudeseune

Jawaban:

23

Gunakan --color=always.

grepmendeteksi apakah output ke pipa (atau file). Anda paling tidak pernah menginginkan warna saat output diarsipkan - karena itu adalah sekuens melarikan diri untuk terminal. Khas:

foo ^[[01;31m^[[Kbar^[[m^[[K

dari eg:

grep pattern file > result

Untuk mengganti penggunaan --color=always.

grep --color=always pattern file | ...

Contoh:

Memiliki file:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

Kemudian

grep --color=always ID file | grep --color=always 2013 | grep foo

akan berwarna ID, 2013dan foo.

grep --color=always ID file | grep 2013 | grep foo

akan mewarnai IDdan foo, tetapi tidak 2013.

1 Penting: Anda juga harus ingat bahwa kekacauan yang ditambahkandari warna diteruskan ke perintah berikutnya dalam rantai. Setelah ID berwarna, Anda tidak bisa (dengan mudah), cocok dengan misID=111.


Pada beberapa kesempatan seseorang mungkin ingin warna terminal dalam file . Coba misalnya

 grep --color=always foo file > result
 cat result

Padahal file yang dihasilkan akan memiliki portabilitas yang sangat terbatas.


Pewarnaan itu sendiri juga merupakan perpanjangan.


Seperti disebutkan oleh @slm yang baik , Anda dapat menambahkan:

export GREP_OPTIONS="--color=always"

.bashrcdll Anda , tetapi jangan kecuali Anda karena alasan tertentu benar-benar memahami implikasi dan masih ingin melakukannya. Dalam banyak hal akan pecah grepkarena fakta yang disebutkan di atas 1 .

Tambahkan aliasjika Anda sering menggunakannya.

 alias cgrep='grep --color=always'

GREP_OPTIONSdan --color mengambil tiga pilihan : never, autodan always. Dua yang pertama harus menjadi satu-satunya yang dipertimbangkan GREP_OPTIONS.

Anda juga dapat memeriksa GREP_COLORSdi manhalaman atau di gnu grep .

Runium
sumber
Rincian tambahan tentang metode ini pro / kontra di sini: stackoverflow.com/questions/867877/…
slm
1
tambahkan ini ke jawabannya juga: export GREP_OPTIONS="--color=always"di .bashrc menjadikan opsi sebagai default untuk greps apa pun, dan Anda telah berhasil melakukannya!
slm
Hal-hal baik dalam T&U Super Uuser ini: superuser.com/questions/36022/…
slm
"grep mendeteksi jika output ke pipa" - aha! Ini kuncinya, grep tidak mewarnai jika itu bagian dari pipa. Seharusnya ada prinsip substitusi terhadap hal semacam ini: - /
Chris2048
@ Chris2048: Ini adalah standar untuk sebagian besar alat mencetak warna ke terminal. Anda mungkin menemukan beberapa detail dengan ini , tentang bagaimana terdeteksi, Dan ini menunjukkan beberapa masalah dengan misalnya ls dan warna pada OSX asli lsdan gnu coreutils.
Runium