Come colorare le colonne di output di ls?


8

Il titolo dice tutto: vorrei ottenere quelle colonne colorate ordinate dell'output di qualcosa come ls -al, diciamo, come nella risposta di 10basetom a questa domanda .

Schermata dello snippet di codice evidenziato dalla sintassi dalla risposta collegata


Bene, questa è un'idea chiara! Ma su quale sistema operativo sei?
Jake Gould,

2
Sembra essere (erroneamente) evidenziato dalla sintassi di Bash dal software SE. Sembra che non sia colorato per colonna ma piuttosto le cifre (numeri) ottengono un colore e tutto ciò che inizia con una maiuscola ne ottiene un altro. La colorazione per colonna è fattibile ma piuttosto diversa.
Bob,

3
In senso generale, è possibile dividere l'uscita sui separatori di colonna con sedo awkinserendo un sequenza di escape ANSI .
Bob,


Sono sul sottosistema Ubuntu di Windows 10, ma sto passando a macOS (dato il disastro completo che WinX si è rivelato essere ...)
Pirx,

Risposte:


8

Questo è fattibile con awk. Sfortunatamente, poiché il formato di ls -lnon è specificato, non è possibile trovare una soluzione che funzionerà su tutti i sistemi, quindi alcune regolazioni di quale colore usare per quale colonna saranno necessarie su alcuni sistemi.


Prima di tutto, vogliamo preservare gli spazi originali utilizzati da ls -l. Altrimenti, l'allineamento della colonna sarà errato. Possiamo farlo con l' FPATopzione, grazie a questa risposta SO :

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

In awkogni param posizionale ( $1, $2ecc) si riferisce ad un campo, prima colonna ossia sulla riga corrente. Ciò che ha fatto l' FPATopzione sopra è ridefinire ogni campo in modo da includere tutti gli spazi precedenti, quindi quando si printesce indietro mantiene gli spazi in modo che le colonne rimangano nella stessa posizione.

Ora possiamo semplicemente modificare ogni campo per inserire il codice colore , quindi stampare l'output modificato:

    {
        $2 = "\033[31m" $2 "\033[0m";
        $3 = "\033[36m" $3 "\033[0m";
        $4 = "\033[36m" $4 "\033[0m";
        $5 = "\033[31m" $5 "\033[0m";
        $6 = "\033[36m" $6 "\033[0m";
        $7 = "\033[36m" $7 "\033[0m";
        $8 = "\033[31m" $8 "\033[0m";
        print
    }
'

Si noti che ogni colonna viene ripristinata ai valori predefiniti ( 0tra [e m) in seguito. Se si desidera che il colore venga eseguito su più colonne, è possibile omettere quel codice. Personalmente, preferisco specificare ogni colonna in modo indipendente.


Puoi definire un comando riutilizzabile nel tuo .bashrc. Per esempio:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "\033[31m" $2 "\033[0m";
            $3 = "\033[36m" $3 "\033[0m";
            $4 = "\033[36m" $4 "\033[0m";
            $5 = "\033[31m" $5 "\033[0m";
            $6 = "\033[36m" $6 "\033[0m";
            $7 = "\033[36m" $7 "\033[0m";
            $8 = "\033[31m" $8 "\033[0m";
            print
        }
    '
}

Potrebbe essere necessario riavviare la bashsessione (o eseguire source ~/.bashrc) per eseguire questa definizione di funzione.

Da qui, puoi semplicemente chiamare lsc, che dovrebbe darti l'output che desideri:

Schermata dell'output colorato


Fantastici ragazzi, questo è quasi quello che voglio ;-) Seriamente, però, vorrei aggiungere un altro tocco e avere i nomi dei file colorati. ls -al --color = auto lo farebbe, ma se solo aggiungessi l'opzione --color alle soluzioni sopra, i codici colore sembrano essere spogliati. Possiamo rimanere a bocca aperta per tenerli?
Pirx,

Secondo commento, questo è più per curiosità: nella risposta a cui ho fatto riferimento nella mia domanda originale, sembra che 10basetom non abbia usato nessuno dei precedenti e avesse ancora le colonne colorate. Mi chiedo se sia perché ha usato una versione diversa di ls o qualche terminale elegante di fantasia?
Pirx,

@Pirx La colorazione nella risposta viene applicata dal software Stack Exchange. Non viene dal loro terminale. È solo perché l'output è stato incollato in un blocco di codice e la domanda aveva un tag bash , che tenta automaticamente di applicare l'evidenziazione della sintassi di Bash a qualsiasi tag di codice nella domanda e risposte ... che in realtà non è corretto in questo caso. Stesso motivo per cui le stringhe nel codice sono rosse nella mia risposta, anche se non le ho colorate intenzionalmente.
Bob

1
@Pirx Use --color=always. Finché non applichi colori diversi alla colonna del nome file ( $9nel mio esempio), awkdovresti passarli attraverso.
Bob

@Pirx Nota laterale, --color=alwaysè un'estensione GNU, quindi se sei su un sistema non GNU (ad esempio macOS, altri BSD) dovrai installare la versione GNU o utilizzare un'alternativa .
Bob

6

Questo stamperà la seconda colonna di ls -alFin rosso, la terza all'ottava in blu e la nona in nero:

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

Questo è solo inteso come esempio. Puoi personalizzare questo a tuo piacimento.

Per coloro che preferiscono il loro codice distribuito su più righe:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

Dettagli

tputè un'utilità per generare un'ampia varietà di codici di controllo per il tuo terminale. Ad esempio, tput setaf nimposta il colore di primo piano su ndove npuò variare da 0 a 7

0  Black
1  Red
2  Green
3  Yellow
4  Blue
5  Magenta
6  Cyan
7  White

Puoi leggere di più su tpute le sue capacità di colore qui .

Le variabili definisce codice awk black, rede blueche contengono i codici terminali rispettivamente nero, rosso e blu,. Questi codici sono posizionati all'inizio di qualsiasi colonna che vogliamo colorare.

Un trucco è che i codici colore non si ripristinano da soli. Pertanto, qualunque sia l'ultimo colore specificato su una riga, a meno che non venga specificato un altro comando color, sarà il colore predefinito per la riga successiva.


1
Eh, buona chiamata per la definizione delle variabili. Non sapevo che potevi farlo dall'interno awk! Suggerirei di includere anche il modello per preservare l'allineamento delle colonne :)
Bob

@Bob E, mi piace il tuo FPATtrucco per mantenere la spaziatura corretta.
Giovanni 1024,
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.