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.



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.


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


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)


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


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.


Apa yang *harus dilakukan Dari halaman manual grep: *: The preceding item will be matched zero or more times.Tapi aku masih tidak mengerti ..!
Shayan
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.