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 .
sed
o awk
inserendo un sequenza di escape ANSI .
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 .
sed
o awk
inserendo un sequenza di escape ANSI .
Risposte:
Questo è fattibile con awk
. Sfortunatamente, poiché il formato di ls -l
non è 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' FPAT
opzione, grazie a questa risposta SO :
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
In awk
ogni param posizionale ( $1
, $2
ecc) si riferisce ad un campo, prima colonna ossia sulla riga corrente. Ciò che ha fatto l' FPAT
opzione sopra è ridefinire ogni campo in modo da includere tutti gli spazi precedenti, quindi quando si print
esce 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 ( 0
tra [
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 bash
sessione (o eseguire source ~/.bashrc
) per eseguire questa definizione di funzione.
Da qui, puoi semplicemente chiamare lsc
, che dovrebbe darti l'output che desideri:
--color=always
. Finché non applichi colori diversi alla colonna del nome file ( $9
nel mio esempio), awk
dovresti passarli attraverso.
--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 .
Questo stamperà la seconda colonna di ls -alF
in 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'
tput
è un'utilità per generare un'ampia varietà di codici di controllo per il tuo terminale. Ad esempio, tput setaf n
imposta il colore di primo piano su n
dove n
può 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 tput
e le sue capacità di colore qui .
Le variabili definisce codice awk black
, red
e blue
che 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.
awk
! Suggerirei di includere anche il modello per preservare l'allineamento delle colonne :)
FPAT
trucco per mantenere la spaziatura corretta.