Mendapatkan hasil berwarna saat menggunakan pipa dari grep menjadi kurang

246

Saya menggunakan opsi --colour dari grep banyak, tetapi saya sering menggunakan lebih sedikit juga. Bagaimana saya bisa menyalurkan hasil grep menjadi lebih sedikit dan tetap mempertahankan pewarnaannya. (Atau mungkinkah itu?)

grep "search-string" -R * --colour | less 

EDIT :

Saya mencari solusi langsung atau apa pun yang setara dengan ini.

Jeremy Powell
sumber
duplikat yang mungkin dari Dapatkan warna dalam perintah 'kurang' '
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Apa yang *harus dilakukan Dari halaman manual grep: *: The preceding item will be matched zero or more times.Tapi aku masih tidak mengerti ..! @JeremyPowell
Shayan

Jawaban:

274

Ketika Anda menjalankannya, grep --coloritu tersirat grep --color=autoyang mendeteksi apakah output adalah terminal dan jika demikian memungkinkan warna. Namun, ketika mendeteksi sebuah pipa, ia menonaktifkan pewarnaan. Perintah berikut:

grep --color=always -R "search string" * | less

Akan selalu mengaktifkan pewarnaan dan mengabaikan deteksi otomatis, dan Anda akan mendapatkan penyorotan warna less.

EDIT: Meskipun menggunakan hanya lessberfungsi untuk saya, mungkin versi yang lebih lama memerlukan -Rbendera untuk menangani warna, seperti yang disarankan di sini.

drrlvn
sumber
143
Anda perlu menggunakan less -Runtuk pengkodean warna untuk ditafsirkan dengan kurang tepat
dari sana
1
Ini bekerja untuk saya dengan hanya less, mungkin tergantung versi.
drrlvn
1
Tambahan (mudah-mudahan) bermanfaat: Saya perlu mengecualikan beberapa pertandingan tetapi mempertahankan pewarnaan, jadi saya benar-benar berakhir dengan grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, yang memenuhi kebutuhan saya dengan sempurna. (Terima kasih lagi!)
Owen Blacker
7
Saya tidak percaya mereka baru saja mengimplementasikan fitur penanganan warna lessdan karena itu melewatkan kesempatan untuk memiliki colorlessalat khusus . Untuk namanya saja sudah seharusnya dilakukan! Saya mungkin harus menulis tambalan yang memanggil -R secara otomatis ketika biner dijalankan sebagai colorless.
Christian
2
@OwenBlacker Mungkin bukan alias. Anda mungkin telah $LESSmengatur dengan -R.
greyfade
27

Anda dapat meletakkan ini di .bashrcfile Anda :

export GREP_OPTIONS="--color=always"

atau buat alias seperti ini:

alias grepc="grep --color=always"

dan Anda perlu menggunakan -Ropsi untuk less, seperti yang ditunjukkan oleh sana

Dennis Williamson
sumber
29
Peringatan !: GREP_OPTIONS = "- color = always" dapat mematahkan banyak skrip yang menggunakan grep (atau (e | f) grep).
mctylr
4
Ya, lebih baik hanya dengan alias grep. Anda selalu dapat menjadi murni grepdengan GREP, atau mengganti --coloropsi secara manual.
asmeurer
Ini tidak bekerja untuk saya, alias tidak berfungsi sekalipun.
saeedgnu
9

Dalam kasus seperti ini, saya lebih suka untuk benar-benar membuat file sh kecil dan meletakkannya di /usr/local/bin.
Saya biasanya menggunakan grepcara rekursif pada pwd, jadi itulah skrip pribadi saya:

#!/bin/sh
grep --color=always -r "$@" . | less -R

Dan kemudian saya baru saja menyalinnya sebagai /usr/local/bin/g(ya, saya sering menggunakannya)

Iazel
sumber
2
Mengapa tidak menggunakan fungsi shell untuk hal seperti ini? g() { grep --color=always -r "$@" . | less -R }bekerja secara identik dan mungkin akan memberikan (lebih baik) kinerja yang lebih baik.
00dani
1
@ 00dani ya, itu alternatif yang valid juga dan kadang-kadang saya menggunakannya. Harap dicatat bahwa dalam kasus ini, sebagian besar waktu dihabiskan di IO dan oleh karena itu tidak ada peningkatan kinerja yang terlihat :) Perbedaan lain adalah bahwa sekali di PATH Anda, skrip ini dapat digunakan dengan skrip shell dan alias lainnya juga; fungsi sebaliknya perlu dimuat secara eksplisit
Iazel
1

Jangan alias "grep", lebih baik untuk alias "kurang" yang tidak pernah digunakan oleh kerang. Dalam Anda .bashrchanya menempatkan: alias less="less -r".

not2qubit
sumber
3
Tidak benar. Orang perlu menggunakan keduanya grep --color=always dan less -R. Perhatikan bahwa grep hanya tahu itu sedang disalurkan ke proses lain dan --color=autoopsi hanya menggunakan informasi ini untuk memutuskan apakah akan menghasilkan warna atau tidak.
brandizzi
3
Perhatikan bahwa lessopsi -rberbeda dari -R. Mungkin -Rlebih aman.
Craig McQueen
1
Jadi mengapa memilih solusi saya. OP secara khusus meminta lesscontoh yang sudah menggunakan opsi `--color '.
not2qubit
3
Sebuah alias mungkin tidak diinginkan di sini. lessmendukung $LESSvariabel lingkungan. Jadi, bukannya alias, export LESS='-R'mungkin lebih disukai.
greyfade
0

Saya harus lari

grep --color=always -R "search string" * | less - r

dengan flag -r setelah kurang , agar ini berjalan.

Pierre François
sumber
Apa yang *harus dilakukan Dari halaman manual grep: *: The preceding item will be matched zero or more times.Tapi aku masih tidak mengerti ..!
Shayan