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?


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 .


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
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.