Le titre en dit long: j'aimerais obtenir ces colonnes aux couleurs vives de la sortie de quelque chose comme ls -al
, disons, comme dans la réponse de 10basetom à cette question .
sed
ou awk
et insérer une séquence d'échappement ANSI .
Le titre en dit long: j'aimerais obtenir ces colonnes aux couleurs vives de la sortie de quelque chose comme ls -al
, disons, comme dans la réponse de 10basetom à cette question .
sed
ou awk
et insérer une séquence d'échappement ANSI .
Réponses:
C'est faisable avec awk
. Malheureusement, comme le format de ls -l
n'est pas spécifié, il n'est pas possible de trouver une solution qui fonctionnera sur tous les systèmes, donc un ajustement de la couleur à utiliser pour quelle colonne sera nécessaire sur certains systèmes.
Tout d'abord, nous voulons conserver les espaces d'origine utilisés par ls -l
. Sinon, l'alignement des colonnes sera incorrect. Nous pouvons le faire avec l' FPAT
option, grâce à cette réponse SO :
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
Dans awk
chaque param position ( $1
, $2
, etc.) se réfère à un champ, soit une colonne sur la ligne courante. L' FPAT
option ci-dessus a redéfini chaque champ pour inclure tous les espaces précédents, donc lorsque vous print
le reculez, il conserve les espaces afin que les colonnes restent dans la même position.
Maintenant, nous pouvons simplement modifier chaque champ pour insérer le code couleur , puis imprimer la sortie modifiée:
{
$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
}
'
Notez que chaque colonne est réinitialisée par défaut ( 0
entre [
et m
) par la suite. Si vous souhaitez que la couleur s'exécute sur plusieurs colonnes, vous pouvez omettre ce code. Personnellement, je préfère spécifier chaque colonne indépendamment.
Vous pouvez définir une commande réutilisable dans votre .bashrc
. Par exemple:
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
}
'
}
Vous devrez peut-être redémarrer votre bash
session (ou l'exécuter source ~/.bashrc
) pour que cette définition de fonction s'exécute.
De là, vous pouvez simplement appeler lsc
, ce qui devrait vous donner la sortie que vous désirez:
--color=always
. Tant que vous n'appliquez pas de couleurs différentes à la colonne du nom de fichier ( $9
dans mon exemple), vous devez awk
les passer.
--color=always
est une extension GNU donc si vous êtes sur un système non GNU (par exemple macOS, autres BSD), vous devrez soit installer la version GNU, soit utiliser une alternative .
Cela imprimera la deuxième colonne ls -alF
en rouge, la troisième à la huitième en bleu et la neuvième en noir:
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'
Il s'agit simplement d'un exemple. Vous pouvez personnaliser cela selon le contenu de votre cœur.
Pour ceux qui préfèrent leur code étalé sur plusieurs lignes:
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
est un utilitaire pour générer une grande variété de codes de contrôle pour votre terminal. Par exemple, tput setaf n
définit la couleur de premier plan n
où n
peut varier de 0 à 7
0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White
Vous pouvez en savoir plus sur tput
ses capacités de couleur ici .
Les variables code awk de Définit black
, red
et blue
qui contiennent les codes de terminaux pour le noir, le rouge et le bleu, respectivement. Ces codes sont placés au début de la colonne que nous voulons colorer.
Une astuce est que les codes de couleur ne se réinitialisent pas d'eux-mêmes. Ainsi, quelle que soit la dernière couleur que vous spécifiez sur une ligne, à moins qu'une autre commande de couleur ne soit spécifiée, sera la couleur par défaut pour la ligne suivante.
awk
! Je suggère que vous incluiez également le motif pour préserver l'alignement des colonnes :)
FPAT
astuce pour garder l'espacement correct.