comando `highlight`


11

Esiste un comando che può essere utilizzato per evidenziare facilmente (con colori, testo in grassetto o sfondo / primo piano invertiti) stringhe specifiche in stdin mentre si passa l'intera stringa a stdout? Sto pensando di costruirlo , ma preferirei semplicemente usarlo se esiste già. Alcune caratteristiche desiderabili:

  1. Le stringhe di evidenziazione separate vengono evidenziate in modo diverso, in modo automatico. Ad esempio, la prima stringa verrà evidenziata in rosso, la seconda in verde, la terza in blu senza configurazione manuale .
  2. Rileva il supporto del colore e ritorna in grassetto / invertito / altri metodi di evidenziazione dove sono disponibili.
  3. Consentire la corrispondenza di espressioni regolari e stringhe letterali.
  4. Preferibilmente fa qualcosa di intelligente se le partite si sovrappongono, come "foobar" e "barbar".
  5. Non viene modificato nulla tra stdin e stdout tranne l'aggiunta di codici colore.


Ooo, bella domanda. Avevo bisogno di questa cosa esatta e ho finito per scrivere qualcosa, ma aveva solo stringhe fisse colorate, non aveva nessuna delle caratteristiche che hai elencato
Michael Mrozek

Piuttosto che scrivere una nuova utility, sarebbe fantastico vederlo come un'aggiunta a grep stesso.
Mattdm,

1
La corretta filosofia unix sarebbe una nuova utility che può essere trasmessa non solo da grep ma anche da altri flussi. Sospetto che ci siano almeno uno o più moduli Perl che probabilmente possono fare questo per te, però ...
Shadur,

1
@Gilles: questa domanda ha una portata molto più limitata. In effetti, leggerlo è stato uno dei motivi per cui ho creato questa domanda: chiedere una soluzione più generale e flessibile.
l0b0

Risposte:


4

Forse il colorante generico di Radovan Garabík (grc) ? Si aspetta un file di configurazione come argomento e funziona con regexp. Quindi non abbastanza senza configurazione, ma è possibile utilizzare la sostituzione del processo ( <(list)), quindi senza configurazione manuale :-)


Per chiarire senza dover aprire la pagina (e renderla ricercabile), "questo" == Colorante generico ; grc e grcat ... Grazie, mi piace.
Peter

grcha uno script di supporto: grcat. Ecco un esempio di come colorare tutte le lettere maiuscole in rosso. Passaggio 1: impostare il file di configurazione: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps passaggio 2; Usalo: echo Hello World | grcat red-caps... La pagina man indica 3 directory di configurazione che cerca, e quindi suggerisce (?) Che il file di configurazione può essere un percorso assoluto, ma quest'ultimo metodo di ricerca del file di configurazione funziona solo con percorsi relativi per me (grc versione 1.3)
Peter.O

5

Sed in soccorso!

Puoi migliorarlo (in quanto ne ha davvero bisogno) ma funziona abbastanza bene.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Per semplicità, hilight accetta una coppia di argomenti (prima la corrispondenza, seconda il colore) In questo script l'attributo è sempre in grassetto

Leggi man console_codes (Graphic Rendition) per vedere le secrezioni di escape del colore, oppure prova questo

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Ha importanti svantaggi nell'utilizzo di queste opere:

$ dmesg | hilight \\[ 34 ] 34

ma questo non lo è affatto:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

perché [: digit:] trova i numeri nelle secrezioni di escape dei precedenti sostituti.

Qualcosa di simile a:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

funzionerà sempre come escluso.

Usando il comando time ho trovato questi incrementi di quattro il tempo trascorso, che non è troppo.

Puoi sostituire il comando sed con qualsiasi altro parser che ti piace o si adatta alle tue esigenze (awk, ecc ...)


2

Si può anche usare egrep con un motivo che corrisponde a ogni riga del carattere non stampabile, come:

dmesg | egrep --color "swap|$"

1

clide funziona bene. Lo uso su RHEL 6.2, dal repository EPEL


+1 per uno strumento molto carino. Sfortunatamente non ha tutte le funzionalità richieste.
l0b0,

1

Se la tua versione grepinclude la colorazione, puoi usare l'alterazione regexp per fare in modo che grep evidenzi il testo e abbini anche ogni riga in modo che nulla sia escluso. Quanto segue dovrebbe fare il trucco:

<your command> |grep "highlightme\|^"

0

Come hai detto nel link, grep --color=alwaysfunziona solo per un modello. Detto questo, non credo che esista un simile strumento.


0

Uso http://em.readthedocs.org/ . Facile da installare su varie piattaforme grazie a Python. Semplice e funziona benissimo.


Benvenuti in Unix & Linux Stack Exchange! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
slm

1
Secondo il centro assistenza : "Tuttavia, devi rivelare la tua affiliazione nelle risposte." Nel caso in cui tu sia lo stesso Igor Kalnitsky che ha scritto em, ti preghiamo di riformulare la tua risposta per essere chiaro che non sei un utente, ma l'autore dello strumento suggerito.
arte
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.