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 .
sedo awkinserendo 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 .
sedo awkinserendo un sequenza di escape ANSI .
Risposte:
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:
--color=always. Finché non applichi colori diversi alla colonna del nome file ( $9nel mio esempio), awkdovresti 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 -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'
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.
awk! Suggerirei di includere anche il modello per preservare l'allineamento delle colonne :)
FPATtrucco per mantenere la spaziatura corretta.