Sintassi evidenziazione / colorazione cat


202

C'è un metodo per colorare l'output di cat, come grepfa.

Nella grepmaggior parte delle console viene visualizzato un output colorato che evidenzia le parole chiave cercate. Altrimenti, puoi forzarlo chiamando grep --color Esiste un modo generico per colorare l'output di qualsiasi programma in base alla tua scelta personale.

Da quanto ho capito, il programma stesso non è responsabile dei colori. È il guscio.

Sto usando la shell predefinita in FreeBSD 5.2.1 che sembra che non abbia mai visto i colori dall'epoca.


Non capisco cosa stai cercando di dire
Lelouch Lamperouge,

oh no Non voglio mostrare un binario. Voglio solo visualizzare l'output di un binario in modo colorato.
Lelouch Lamperouge,

6
meh - FTFY (puoi sempre modificare le tue domande)
vedi il

Ho modificato per evitare confusione riguardo al termine "binario"
Volker Siegel,

3
Penso che la risposta di @buergi corrisponda alla domanda, e questo è supportato anche dal numero di voti che ha. Valuta la possibilità di cambiare la risposta accettata.
Ioannis Filippidis,

Risposte:


22

catcon l'evidenziazione della sintassi è semplicemente fuori portata. catnon è pensato per questo. Se si desidera semplicemente colorare l'intero contenuto di alcuni file (con lo stesso colore per l'intero file), è possibile utilizzare sequenze di escape terminali per controllare il colore.

Ecco uno script di esempio che sceglierà il colore in base al tipo di file (puoi usare qualcosa del genere invece di invocare catdirettamente):

#!/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"

Quanto sopra (su un terminale che supporta quelle sequenze di escape) stamperà qualsiasi file di testo come 'grassetto' e stamperà qualsiasi file binario come rosso. È possibile utilizzare stringsinvece di catstampare file binari e migliorare la logica per adattarla alle proprie esigenze.


Stavo pensando a qualcosa del genere. Ma ho bisogno di qualcosa che lo farebbe universalmente. Non solo cat/ grep/any particular program
Lelouch Lamperouge,

Quindi puoi semplicemente passare il comando da eseguire come argomento per lo script e sostituire l' catinvocazione codificata con una parte $cmdinizializzata come $ 1 se ci sono due argomenti o un valore predefinito se ce n'è solo uno. Quindi è sufficiente scrivere: colorful.sh grep file.
Costi Ciudatu,

8
"gatto non è pensato per quello." Cat non è pensato neanche per scrivere singoli file su stdout, ma per concatenare. Ma ciò non significa ancora che scrivere singoli file su stdout non sia utile. Ciò non significa che evidenziarli non sia utile.
mikemaccana,

Ho provato, sotto Cygwin pygmentizenon è in grado di colorare. Qualche consiglio?
truthadjustr,

409

Consiglierei pygmentizedal pacchetto python python-pygments. Potresti voler definire il seguente utile alias (a meno che tu non usi ccatdal pacchetto ccrypt).

alias ccat='pygmentize -g'

La sintassi ha evidenziato l'output del gatto usando pygmentize

E se vuoi i numeri di riga:

alias ccat='pygmentize -g -O style=colorful,linenos=1'

22
Un'altra soluzione è usare il highlightcomando linux . alias ccat='highlight -O ansi'
Evan Purkhiser,

99
Questa dovrebbe essere la risposta accettata IMHO. In aggiunta a ciò, l'ho detto come alias dog='pygmentize -g', perché i cani sono più fighi dei gatti!
polimero

8
Puoi aggiungere meno -R per rendere il codice scorrevole:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH

6
Ho chiamato il mio alias nyancat.
zneak,

2
pygmentize funziona come previsto, ma sfortunatamente sembra essere piuttosto lento. : - /
Frerich Raabe,

113

Opzioni:

Pygmentize è buono. Ho un alias:

alias c='pygmentize -g'

ma l' highlight è un'altra alternativa ampiamente disponibile

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

Installazione:

Potrebbe essere necessario installare pygmentsutilizzando:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

e per il highlightpacchetto che è facilmente disponibile su tutte le distribuzioni

sudo apt-get install highlight
sudo yum install highlight

In azione:

Allego scatti per entrambi in basso per un buon confronto tra i momenti salienti

Ecco pygmentizein azione: Evidenziazione Pygmentize sul file Python

e questo è highlight: Evidenzia l'evidenziazione sul file Python


4
highlightha funzionato perfettamente per le mie esigenze e installato facilmente, grazie. Se vuoi guardare i file senza estensioni (ad esempio .bash_aliases), aggiungi --syntax=basholtre -O ansia forzarlo.
jerclarke,

1
# pip install Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # chiudi terminale # apri terminale # catc test.js --- e lavori perfetti :-) 😊
BG Bruno

3
highlightè 34 volte più veloce di quel programma python. Il potere delle lingue classiche è forte.
Avindra Goolcharan,

2
Per highlight, si desidera aggiungere --forceall'alias, altrimenti genererà un errore per i formati di file che non comprende, mentre come catsostituzione si desidera mostrare ancora l'output senza evidenziare, che è ciò che --forcefa. Tutti insieme:alias cat="highlight -O ansi --force"
Alexander Klimetschek il

1
@Luke ecco perché dovresti aggiungere che l' -O ansiimpostazione predefinita è l'output html :-)
Thomas,

59

Da fine aprile 2018 in poi:

Bat : clone di un gatto (1) con evidenziazione della sintassi e integrazione Git.

Il progetto è un clone di gatto con supporto per colori e personalizzazioni scritte in Rust. Offre non solo l'evidenziazione della sintassi con più temi, ma anche l'integrazione con Git. Come descritto nella documentazione:

bat cerca di raggiungere i seguenti obiettivi :

  • Fornisce una messa in evidenza bella e avanzata della sintassi
  • Integrazione con Git per mostrare le modifiche ai file
  • Essere un sostituto drop-in per (POSIX) cat
  • Offri un'interfaccia a riga di comando intuitiva

Inutile dire che è molto più veloce di pygmentize e non si strozza quando si confronta con file di grandi dimensioni.

Il codice sorgente e le versioni binarie + le istruzioni di installazione sono disponibili nel repository Github, nonché un confronto con programmi alternativi .


5
Ciò che la gente dimentica di menzionare è che batrimane in modalità interattiva per impostazione predefinita. Perché si comporti più come cat, usalo con -ppargomento. Un alias simile alias cat="bat -pp"è probabilmente ciò che la gente sta cercando.
Canella,

1
Ho già usato pygmentize per colorare il gatto, ma la soluzione con bat è molto più adatta per file di grandi dimensioni (registri di diversi MB), dove le prestazioni di pygmentize sono scadenti.
Christian.D,

35

vimcat è a file singolo (shell script) e funziona bene:

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

Ultimo aggiornamento è da dicembre 2013. Suggerimento: è possibile forzare il tipo di file riconoscimento da parte vimcat -c "set ft=<type>".


12
Una cosa che è davvero bella di vimcat (o vimpager) è che rispetterà lo schema di colori che hai definito nel tuo ~/.vimrcmodo di evidenziare la sintassi sarà lo stesso sia quando vuoi modificare (vim) o stampare (vimcat). Si noti che una versione aggiornata di vimcat è disponibile nel repository di vimpager .
timss

La risposta di Amaynut è più antica e simile
olibre,

vimpagernon usa il mio sistema di colori vim.
WhyNotHugo

2
Nel mio rapido test non scientifico, vimcat(tempo di esecuzione di 1 ~ 2 secondi) è molto più lento di pymentize(~ 200ms), che è molto più lento di highlight(~ 20ms), che è molto più lento di cat(~ 2ms). D'altra parte, vimcatgestisce più tipi di file ed è più preciso hightlighte pygmentize, ed è ancora più veloce di prima vim, allora :q. Quindi guadagna la mia scelta per questo compito specifico.
Penghe Geng,

1
@olibre Questa risposta sembra più antica di quella di Amaynut.
Franklin Yu,

31

Lo strumento che stai cercando è probabilmente un supercat (ecco una breve introduzione pubblicata dal Linux Journal).

Mi rendo conto che questa risposta è in ritardo e che non soddisfa pienamente i requisiti del PO. Quindi lo sto aggiungendo solo per riferimento (potrebbe essere utile per altre persone che cercano come colorare l'output del file di testo).


1
Questo non sembra funzionare così facilmente, l'ho installato e usato l'esempio di configurazione, ma non ha avuto alcun effetto di colore
rubo77

Bello, tutto il resto è troppo lento. Questo è buono. Per informazioni sulla configurazione, vedere manpages.debian.org/testing/supercat/spc.1.en.html
okovko

Inoltre per alcune configurazioni per varie lingue: github.com/tanderson92/supercat/tree/master/spcrc
okovko

20

Esiste una versione colorata di cat - ccat . Scarica da https://github.com/jingweno/ccat/ .

Installazione su Linux / Windows / macOS

È un singolo eseguibile autonomo, quindi per installarlo puoi decomprimere la versione binaria per il tuo sistema operativo da https://github.com/jingweno/ccat/releases e copiare il file binario ccat per esempio in/usr/local/bin .

Se vuoi evitare i binari o se non esiste un binario per la tua piattaforma (ad es. Raspberry pi, ecc.), Puoi alternativamente compilare dal sorgente dato che hai un goambiente di sviluppo funzionante ( apt install golangsu Linux basati su Debian o brew install golangsu Mac):

go get -u github.com/jingweno/ccat

Il file ccatbinario verrà creato sotto il tuo $GOPATH/bin.

Installazione su Mac tramite homebrew

brew install ccat

Alias ​​a cat

Per sostituire il normale catcon il ccatcomponente aggiuntivo ~/.bashrc:

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

ccatè implementato in Go , quindi è un binario nativo che funziona molto più velocemente rispetto alle soluzioni basate su Python, come i pygments , il modulo dietro pygmentize; Non ho notato alcuna differenza di velocità evidente tra cate ccat.


1
Qual è il nome repository corretto? apt-get ccat in Ubuntu 16 mi dà una sorta di programma di crittografia e in qualche modo in modo esilarante ha bloccato il mio terminale mentre attualmente sta cercando di crittografare o decrittografare la mia intera directory proc ...
Katastic Voyage

@KatasticVoyage: il mio male: per qualche ragione ho pensato che fosse nei repository, e ho dimenticato come l'ho ottenuto nella mia casella Ubuntu. Vedi la risposta aggiornata.
ccpizza,

2
Attualmente, sembra che brew install ccatsia abbastanza, non è più necessario brew tap.
Jeff Huijsmans,

12

Il modo migliore e il modo più semplice per farlo se hai vim nella tua macchina è usare quello vimcatche viene fornito con il vimpagerprogramma.

  1. Installa vimpage con git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Esegui vimcat:

    vimcat index.html


Adoro l'idea, ma vimcat è tra i più lenti qui. È lento quanto la critica. 15 volte più lento di highlighte 3 volte più lento rispetto bata uno script bash di 30 righe sulla mia macchina.
Ponkadoodle,

11

source-highlight

Forse è possibile trovare interessanti source-highlight rilasciati sotto GNU : un pacchetto diverso da highlight.

Estratto da apt-cache show source-highlight:

Descrizione-it: converte il codice sorgente in un documento evidenziato dalla sintassi.
Questo programma, dato un file sorgente, produce un documento con l'evidenziazione della sintassi.
Supporta l'evidenziazione della sintassi per oltre 100 formati di file ...
Per l'output, sono supportati i seguenti formati: HTML, XHTML, LaTeX, Texinfo, sequenze di escape colore ANSI e DocBook

Ho fatto un po 'di alias (Cat e PCat, vedi sotto) e questo è il loro risultato

Esempio di schermata

È possibile installare su Debian in base a

sudo apt-get install source-highlight

e aggiungilo come alias, ad es. nel tuo .bash_aliasescon qualcosa come la linea qui sotto.

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

Oppure puoi fare un alias simile (senza -ialla fine avere la possibilità di eseguire il pipe )

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

Tra le opzioni che è possibile leggere man source-highlightdalle -ssottolineature che è possibile selezionare, o la forza , l'evidenziazione da riga di comando o di lasciare il programma di questo dovere:

-s , --src-lang = STRING lingua di origine (utilizzare --lang-list per ottenere l'elenco completo). Se non specificato, la lingua di origine verrà indovinata dall'estensione del file .

--lang-list elenca tutta la lingua supportata e il file di definizione della lingua associata


1
Se vuoi anche colorare lesscon source-highlight, qualcuno su GitHub dà la risposta: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"e export LESS=" -R ". Molto utile quando pygmentizenon è disponibile e non può essere installato.
Lalylulelo,

8

Da quello che ho capito, il binario stesso non è responsabile dei colori. È il guscio.

Non è corretto Il terminale interpreta semplicemente i codici colore che vengono inviati al terminale. A seconda della sua capacità, può ignorare determinati codici di formattazione / colorazione.

Dalla pagina man non sembra che il gatto supporti la colorazione del suo output. Anche se dovesse supportare la colorazione come grep, cosa dovrebbe colorare nel file di testo? Sintassi che evidenzia la necessaria conoscenza del linguaggio sottostante che non rientra nell'ambito di una semplice utility come cat.

Puoi provare editor più potenti come vim, emacs, gedit ecc. Su piattaforma unix se vedere il codice evidenziato è il tuo obiettivo.


3
" catNon è per stampare file con numeri di riga, non è per comprimere più righe vuote, non è per guardare caratteri ASCII non stampabili, è per concatenare file". - da UNIX Style, o cat -v considerato dannoso .
Scott,

7

Su OSX semplicemente brew install ccat.

https://github.com/jingweno/ccat . Come cat ma mostra contenuti con l'evidenziazione della sintassi. Costruito in Go.


Bello. Presenta alcune limitazioni linguistiche, ma sembra molto più veloce dei pigmenti.
Gustavo Bezerra,

ccat si trova anche nel repository AUR di Arch Linux. Usa yaourt o pacaur per installare il pacchetto.
Mar


3

Vecchia domanda, ho solo risposto al record per fornire la soluzione che ho finito per usare. Forse questo è un po 'confuso (probabilmente non l'intento originale del parametro), ma:

alias cgrep = 'grep -C 9000'

gatto qualunque | cgrep 'snozzberries'

.. grep -C Nfornirà N righe di contesto sopra e sotto l'elemento trovato. Se è più grande dell'input, l'intero input è incluso. In questo caso, ci assicuriamo solo che sia più grande di qualsiasi uscita terminale tipica che vorremmo guardare manualmente, che è generalmente ciò che stai cercando di fare se si evidenzia.

EDIT: Tuttavia, questa soluzione suggerita di seguito da Beni Cherniavsky-Paskin è superiore: corrisponde (e mette in evidenza) la parola che stai cercando o l'inizio della riga (non evidenziatore). Il risultato netto è esattamente quello che vuoi.

cat whatever | egrep 'snozzberries|$'

Questa è la nuova migliore soluzione che ho visto per quel problema, grazie Beni.


2
Un modo più robusto per evidenziare uno schema includendo tutte le linee èegrep 'snozzberries|$'
Beni Cherniavsky-Paskin,


1

Ho scritto la piccola sceneggiatura per eseguire la colorazione usando 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
}

E quindi creare un alias per lo script. alias cat=colorize_via_pygmentize. Inoltre, non dimenticare di salvarlo in ~ / .bashrc .


0

Se vuoi solo un liner per impostare l' catoutput su un determinato colore, puoi aggiungere

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

alla tua ~/.$(basename $SHELL)rc

Ecco una sintesi con i codici colore: https://gist.github.com/chrisopedia/8754917

Mi piace '\e[1;93m', che è giallo ad alta intensità. Sembra così:inserisci qui la descrizione dell'immagine


0

basta usare vim e questo file vimrc .

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 può anche essere un'alternativa.


0

Inserisci nel tuo ~ / .bashrc

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

poi

ccat filename

Whalebrew crea alias per le immagini Docker in modo da poterle eseguire come se fossero comandi nativi. È come Homebrew, ma con immagini Docker.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.