Menyoroti / mewarnai kucing

202

Apakah ada metode untuk mewarnai output cat, caranya grep.

Sebab grep, di sebagian besar konsol itu menampilkan output berwarna menyoroti kata kunci yang dicari. Jika tidak, Anda dapat memaksanya dengan menelepon grep --color Apakah ada cara umum untuk mewarnai output dari program apa pun sesuai dengan pilihan pribadi Anda.

Dari apa yang saya mengerti, program itu sendiri tidak bertanggung jawab atas warna. Itu adalah cangkangnya.

Saya menggunakan shell default di FreeBSD 5.2.1 yang sepertinya belum pernah melihat warna sejak zaman dulu.

Lelouch Lamperouge
sumber
Saya tidak mengerti apa yang Anda katakan
Lelouch Lamperouge
Oh tidak. Saya tidak ingin menampilkan biner. Saya hanya ingin menampilkan output dari biner secara berwarna.
Lelouch Lamperouge
6
meh - FTFY (Anda selalu dapat mengedit pertanyaan Anda sendiri)
lihat
Saya diedit untuk menghindari kebingungan mengenai istilah "biner"
Volker Siegel
3
Saya pikir jawaban oleh @buergi cocok dengan pertanyaan, dan ini juga didukung oleh jumlah upvotes yang dimilikinya. Pertimbangkan untuk mengubah jawaban yang diterima.
Ioannis Filippidis

Jawaban:

22

catdengan penyorotan sintaks hanya di luar ruang lingkup. cattidak dimaksudkan untuk itu. Jika Anda hanya ingin seluruh isi beberapa file diwarnai dengan cara tertentu (dengan warna yang sama untuk seluruh file), Anda dapat menggunakan urutan pelarian terminal untuk mengontrol warna.

Berikut ini skrip sampel yang akan memilih warna berdasarkan jenis file (Anda dapat menggunakan sesuatu seperti ini alih-alih memohon catsecara langsung):

#!/bin/bash
fileType="$(file "$1" | grep -o 'text')"
if [ "$fileType" == 'text' ]; then
    echo -en "\033[1m"
else
    echo -en "\033[31m"
fi
cat $1
echo -en "\033[0m"

Di atas (pada terminal yang mendukung urutan pelarian itu) akan mencetak file teks apa pun sebagai 'tebal', dan akan mencetak file biner apa pun sebagai warna merah. Anda dapat menggunakan stringsalih-alih catuntuk mencetak file biner dan Anda dapat meningkatkan logika untuk membuatnya sesuai dengan kebutuhan Anda.

Costi Ciudatu
sumber
Saya sedang memikirkan sesuatu seperti ini. Tetapi saya membutuhkan sesuatu yang akan melakukannya secara universal. Bukan hanya cat/ grep/any particular program
Lelouch Lamperouge
Kemudian Anda bisa dengan mudah menyampaikan perintah yang akan dieksekusi sebagai argumen ke skrip dan mengganti catdoa hard-coded dengan beberapa $cmdyang diinisialisasi sebagai $ 1 jika ada dua argumen atau default jika hanya ada satu. Kemudian Anda hanya menulis: colorful.sh grep file.
Costi Ciudatu
8
"Kucing tidak dimaksudkan untuk itu." Cat juga tidak dimaksudkan untuk menulis file individual ke stdout - tetapi untuk penyatuan. Tetapi itu masih tidak berarti bahwa menulis file individual ke stdout tidak berguna. Tidak berarti menyoroti mereka tidak berguna.
mikemaccana
Saya mencoba, di bawah cygwin pygmentizetidak dapat warna. Ada tips?
truthadjustr
409

Saya akan merekomendasikan pygmentizedari paket python python-pygments. Anda mungkin ingin mendefinisikan alias praktis berikut (kecuali jika Anda gunakan ccatdari paket ccrypt).

alias ccat='pygmentize -g'

Sintaksis yang disorot keluaran kucing menggunakan pygmentize

Dan jika Anda ingin nomor baris:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
sumber
22
Solusi lain adalah dengan menggunakan highlightperintah linux . alias ccat='highlight -O ansi'
Evan Purkhiser
99
Ini harus menjadi jawaban IMHO yang diterima. Selain itu, saya juga menyebutnya alias dog='pygmentize -g', karena anjing lebih keren daripada kucing!
polym
8
Anda dapat menambahkan lebih sedikit -R untuk membuat kode dapat digulir:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
Saya menelepon alias saya nyancat.
zneak
2
Menghitung bekerja seperti yang diharapkan, tetapi sayangnya tampaknya agak lambat. : - /
Frerich Raabe
113

Pilihan:

menghafal itu bagus. Saya memiliki alias:

alias c='pygmentize -g'

tetapi highlight adalah alternatif lain yang tersedia secara luas

alias cats='highlight -O ansi --force'

Instalasi:

Anda mungkin harus menginstal pygmentsmenggunakan:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

dan untuk highlightpaket yang mudah tersedia di semua distribusi

sudo apt-get install highlight
sudo yum install highlight

Dalam Aksi:

Saya melampirkan bidikan untuk keduanya di bawah untuk perbandingan yang baik dalam sorotan

Disini adalah pygmentize beraksi: Menyoroti sorotan pada file python

dan ini adalah highlight: Sorot sorotan pada file python

Shubham Chaudhary
sumber
4
highlightbekerja dengan baik untuk kebutuhan saya dan diinstal dengan mudah, terima kasih. Jika Anda ingin melihat file tanpa ekstensi (mis. .Bash_aliases), tambahkan --syntax=bashjuga -O ansiuntuk memaksanya.
jerclarke
1
# pip instal Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # tutup terminal # terminal terbuka # catc test.js --- dan pekerjaan sempurna :-) 😊
BG Bruno
3
highlight34x lebih cepat dari program python itu. Kekuatan bahasa klasik sangat kuat.
Avindra Goolcharan
2
Sebab highlight, Anda ingin menambahkan --forcealias, jika tidak maka akan menimbulkan kesalahan untuk format file yang tidak dimengerti, sementara sebagai catpengganti Anda ingin itu tetap menampilkan output tanpa menyoroti, yang adalah apa --force. Semua bersama-sama:alias cat="highlight -O ansi --force"
Alexander Klimetschek
1
@ Lukas itulah sebabnya Anda harus menambahkan -O ansidefault ke output html :-)
Thomas
59

Dari akhir April 2018 dan selanjutnya:

Bat - Seekor kucing (1) mengkloning dengan sintaks dan integrasi Git.

Proyek ini adalah kloning kucing dengan dukungan untuk warna dan penyesuaian yang ditulis dalam Rust. Ia tidak hanya menawarkan penyorotan sintaksis dengan banyak tema, tetapi juga integrasi Git. Seperti yang dijelaskan dalam dokumentasi:

kelelawar mencoba untuk mencapai tujuan-tujuan berikut :

  • Berikan highlight sintaksis yang indah dan canggih
  • Integrasikan dengan Git untuk menampilkan modifikasi file
  • Jadilah pengganti drop-in untuk kucing (POSIX)
  • Menawarkan antarmuka baris perintah yang mudah digunakan

Ini, tentu saja, jauh lebih cepat daripada menghitung dan tidak tersedak ketika dihadapkan dengan file besar.

Kode sumber dan rilis biner + instruksi instalasi dapat ditemukan di repositori Github, serta perbandingan dengan program alternatif .

dangom
sumber
5
Apa yang orang lupa sebutkan adalah bahwa battetap dalam mode interaktif secara default. Agar lebih berperilaku seperti cat, gunakan dengan -ppargumen. Alias ​​like alias cat="bat -pp"adalah apa yang orang cari.
Canella
1
Saya telah menggunakan pyrengukuran untuk mewarnai kucing sebelumnya, tetapi solusi dengan kelelawar jauh lebih cocok untuk file besar (log dari beberapa MB), di mana kinerja pyrgukuran berada di bawah standar.
Christian.D
35

vimcat adalah file tunggal (skrip shell) dan berfungsi dengan baik:

http://www.vim.org/scripts/script.php?script_id=4325

Pembaruan terakhir adalah dari Desember 2013. Petunjuk: Anda dapat memaksa pengenalan jenis file dengan vimcat -c "set ft=<type>".

Soergener
sumber
12
Satu hal yang benar-benar baik tentang vimcat (atau vimpager) adalah bahwa ia akan menghormati skema warna yang telah Anda tetapkan dalam ~/.vimrcjadi sintaks Anda akan sama baik ketika ingin mengedit (vim) atau mencetak (vimcat). Perhatikan bahwa versi vimcat yang diperbarui dapat ditemukan di repositori vimpager .
timss
Jawaban Amaynut lebih tua dan serupa
olibre
vimpagertidak menggunakan skema warna vim saya.
WhyNotHugo
2
Dalam tes cepat ilmiah saya, vimcat(1 ~ 2 detik waktu eksekusi) jauh lebih lambat daripada pymentize(~ 200 ms) highlight, yang jauh lebih lambat daripada cat(~ 20 ms) , yang jauh lebih lambat dari (~ 2 ms). Di sisi lain, vimcatmenangani lebih jenis file dan lebih akurat dibandingkan hightlightdan pygmentize, dan masih lebih cepat dari pertama vimkemudian :q. Jadi saya mendapatkan pilihan untuk tugas khusus ini.
Penghe Geng
1
@ Colibre Jawaban ini sepertinya lebih tua dari yang dari Amaynut.
Franklin Yu
31

Alat yang Anda cari mungkin adalah supercat (inilah pengantar cepat yang diterbitkan oleh Linux Journal).

Saya menyadari bahwa jawaban ini terlambat, dan tidak sepenuhnya memenuhi persyaratan OP. Jadi saya menambahkannya hanya untuk referensi (ini bisa berguna untuk orang lain yang mencari cara mewarnai keluaran file teks).

mfriedman
sumber
1
Ini sepertinya tidak bekerja dengan mudah, saya menginstalnya dan menggunakan contoh konfigurasi, tetapi itu tidak memiliki efek warna
rubo77
Bagus, semuanya terlalu lambat. Ini bagus. Untuk bantuan dengan konfigurasi, lihat manpages.debian.org/testing/supercat/spc.1.en.html
okovko
Selain itu untuk beberapa konfigurasi untuk berbagai bahasa: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Ada versi cat- ccat berwarna . Dapatkan dari https://github.com/jingweno/ccat/ .

Instalasi di Linux / Windows / macOS

Ini adalah eksekusi mandiri tunggal sehingga untuk menginstalnya Anda dapat membongkar versi biner untuk OS Anda https://github.com/jingweno/ccat/releases dan menyalin biner ccat misalnya ke/usr/local/bin .

Jika Anda ingin menghindari binari, atau jika tidak ada biner untuk platform Anda (mis. Raspberry pi, dll), maka Anda dapat secara kompilasi mengkompilasi dari sumber mengingat Anda memiliki golingkungan pengembangan yang berfungsi ( apt install golangpada linux berbasis debian atau brew install golangpada mac):

go get -u github.com/jingweno/ccat

The ccatbiner akan dibuat di bawah Anda $GOPATH/bin.

Menginstal di Mac melalui homebrew

brew install ccat

Alias ​​to cat

Untuk mengganti biasa cat dengan ccatmenambahkan ~/.bashrc:

alias cat="ccat $*"
alias cat0="/bin/cat $*" # for cases when you need plain `cat`

ccatdiimplementasikan dalam Go , jadi itu adalah biner asli yang berjalan jauh lebih cepat daripada solusi berbasis Python, seperti pygments , modul di belakang pygmentize; Saya tidak melihat perbedaan kecepatan yang mencolok antara catdan ccat.

ccpizza
sumber
1
Apa nama repo yang tepat? apt-get ccat di Ubuntu 16 memberi saya semacam program enkripsi dan agak meremehkan terminal saya karena saat ini sedang mencoba untuk mengenkripsi atau mendekripsi seluruh direktori proc saya ...
Katastic Voyage
@KatasticVoyage: salahku: entah kenapa aku menganggapnya ada di repo, dan aku lupa bagaimana aku mendapatkannya di kotak ubuntu. Lihat jawaban yang diperbarui.
ccpizza
2
Saat ini, sepertinya brew install ccatsudah cukup, tidak perlu brew taplagi.
Jeff Huijsmans
12

Cara terbaik dan cara termudah untuk melakukannya jika Anda memiliki vim di mesin Anda adalah dengan menggunakan vimcatyang datang dengan vimpagerprogram.

  1. Instal vimpage dengan git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Jalankan vimcat:

    vimcat index.html

Amaynut
sumber
Saya suka idenya, tetapi vimcat termasuk yang lebih lambat di sini. Ini tentang selambat-lambatnya membesar-besarkan. 15x lebih lambat dari highlightdan 3x lebih lambat dari batuntuk skrip bash 30-baris pada komputer saya.
Ponkadoodle
11

source-highlight

Mungkin itu mungkin untuk menemukan source-highlight rilis menarik di bawah GNU : paket berbeda dari highlight.

Kutipan dari apt-cache show source-highlight:

Deskripsi-id: mengonversi kode sumber ke sintaks dokumen yang disorot.
Program ini, diberikan file sumber, menghasilkan dokumen dengan penyorotan sintaksis.
Ini mendukung penyorotan sintaksis untuk lebih dari 100 format file ...
Untuk output, format berikut didukung: HTML, XHTML, LaTeX, Texinfo, urutan pelarian warna ANSI , dan DocBook

Saya melakukan beberapa alias (Cat dan PCat, lihat di bawah) dan ini adalah output mereka

Contoh Layar

Anda dapat menginstal berdasarkan Debian dengan

sudo apt-get install source-highlight

dan tambahkan sebagai alias misalnya di Anda .bash_aliasesdengan sesuatu seperti baris di bawah ini.

alias Cat='source-highlight --out-format=esc -o STDOUT -i'  
Cat myfile.c # or myfile.xml ...

Atau Anda dapat melakukan alias serupa (tanpa -idi akhir memiliki kemungkinan untuk pipa )

alias PCat='source-highlight --out-format=esc -o STDOUT '
tail myfile.sh | PCat     # Note the absence of the `-i`

Di antara opsi yang bisa dibaca man source-highlight yang -smenggarisbawahi bahwa adalah mungkin untuk memilih, atau kekuatan , yang menyoroti dengan baris perintah atau meninggalkan untuk program tugas ini:

-s , --src-lang = STRING bahasa sumber (gunakan --lang-list untuk mendapatkan daftar lengkap). Jika tidak ditentukan, bahasa sumber akan ditebak dari ekstensi file .

--lang-daftar daftar semua bahasa yang didukung dan file definisi bahasa yang terkait

Cepat
sumber
1
Jika Anda ingin juga mewarnai lessdengan source-highlight, seseorang di GitHub memberikan jawabannya: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"dan export LESS=" -R ". Sangat berguna ketika pygmentizetidak tersedia dan tidak dapat diinstal.
Lalylulelo
8

Dari apa yang saya mengerti, biner itu sendiri tidak bertanggung jawab atas warna. Itu adalah cangkangnya.

Itu tidak benar. Terminal hanya mengartikan kode warna yang dikeluarkan ke terminal. Bergantung pada kemampuannya, ia dapat mengabaikan kode pemformatan / pewarnaan tertentu.

Dari halaman manual, sepertinya kucing tidak mendukung pewarnaan hasilnya. Bahkan jika itu untuk mendukung pewarnaan seperti grep apa yang harus diwarnai dalam file teks? Sintaksis menyoroti pengetahuan yang diperlukan tentang bahasa yang mendasarinya yang tidak berada dalam lingkup utilitas sederhana seperti kucing.

Anda dapat mencoba editor yang lebih kuat seperti vim, emacs, gedit dll pada platform unix jika melihat kode yang disorot adalah tujuan Anda.

Ashwinee K Jha
sumber
3
" catBukan untuk mencetak file dengan nomor baris, itu bukan untuk mengompresi beberapa baris kosong, itu bukan untuk melihat karakter ASCII yang tidak dicetak, itu untuk menggabungkan file." - dari UNIX Style, atau cat -v Dianggap Berbahaya .
Scott
7

Pada OSX cukup lakukan brew install ccat.

https://github.com/jingweno/ccat . Suka kucing tetapi menampilkan konten dengan penyorotan sintaksis. Dibangun di Go.

joost
sumber
Bagus. Memiliki beberapa keterbatasan bahasa tetapi rasanya jauh lebih cepat daripada pigmen.
Gustavo Bezerra
ccat juga dapat ditemukan di repositori AUR dari Arch Linux. Gunakan yaourt atau pacaur untuk menginstal paket.
Marcs
6

kelelawar yang tepat melakukan itu dan dapat diartikan sebagai kucingalias cat='bat'

Sailendra Pinupolu
sumber
3

Pertanyaan lama, hanya menjawab catatan untuk memberikan solusi yang akhirnya saya gunakan. Mungkin ini sedikit hacky (mungkin bukan maksud asli dari parameter), tetapi:

alias cgrep = 'grep -C 9000'

kucing apa pun | cgrep 'snozzberries'

.. grep -C Nakan memberikan N baris konteks di atas dan di bawah item yang ditemukan. Jika lebih besar dari input, seluruh input disertakan. Dalam hal ini, kami hanya memastikan itu lebih besar dari keluaran terminal tipikal yang ingin kami lihat secara manual, yang umumnya ingin Anda lakukan jika menyorot.

EDIT: Namun, solusi yang disarankan di bawah ini oleh Beni Cherniavsky-Paskin lebih unggul - cocok dengan (dan menyoroti) baik kata yang Anda cari atau awal dari garis (tidak dapat disorot). Hasil bersihnya persis seperti yang Anda inginkan.

cat whatever | egrep 'snozzberries|$'

Itu solusi terbaik baru yang pernah saya lihat untuk masalah itu, terima kasih Beni.

Tuan B
sumber
2
Cara yang lebih kuat untuk menyoroti pola sambil menyertakan semua garis adalahegrep 'snozzberries|$'
Beni Cherniavsky-Paskin
1

Saya telah menulis skrip kecil untuk melakukan pewarnaan menggunakan pygmentize.

colorize_via_pygmentize() {
    if [ ! -x "$(which pygmentize)" ]; then
        echo "package \'Pygments\' is not installed!"
        return -1
    fi

    if [ $# -eq 0 ]; then
        pygmentize -g $@
    fi

    for FNAME in $@
    do
        filename=$(basename "$FNAME")
        lexer=`pygmentize -N \"$filename\"`
        if [ "Z$lexer" != "Ztext" ]; then
            pygmentize -l $lexer "$FNAME"
        else
            pygmentize -g "$FNAME"
        fi
    done
}

Dan kemudian membuat alias ke skrip. alias cat=colorize_via_pygmentize. Juga jangan lupa untuk menyimpan ini di ~ / .bashrc .

Rohit Sehgal
sumber
0

Jika Anda hanya ingin satu liner untuk mengatur catoutput ke warna yang diberikan, Anda dapat menambahkan

alias cat="echo -en 'code' | cat - "

untuk Anda ~/.$(basename $SHELL)rc

Berikut adalah intisari dengan kode warna: https://gist.github.com/chrisopedia/8754917

Saya suka '\e[1;93m', yang intensitas tinggi kuning. Ini terlihat seperti ini:masukkan deskripsi gambar di sini

okovko
sumber
0

cukup gunakan vim dan file vimrc ini .

oneliner:

vim -c '1' -c 'set cmdheight=1' -c 'set readonly' -c 'set nomodifiable' -c 'syntax enable' -c 'set guioptions=aiMr' -c 'nmap q :q!<CR>' -c 'nmap <Up> <C-Y>' -c 'nmap <Down> <C-E>' -c 'nmap ^V <C-F><C-G>' "$@" 

nano -v mungkin juga bisa menjadi alternatif.

eadmaster
sumber
0

Tempatkan di ~ / .bashrc Anda

function ccat() { docker run -it -v "$(pwd)":/workdir -w /workdir whalebrew/pygmentize $1; }

kemudian

ccat filename

Whalebrew membuat alias untuk gambar Docker sehingga Anda dapat menjalankannya seolah-olah itu adalah perintah asli. Ini seperti Homebrew, tetapi dengan gambar Docker.

javajon
sumber