J'essaie d'obtenir chaque commande grep pour mettre en évidence ses résultats dans une couleur différente. Je peux le faire manuellement avec une ligne comme celle-ci:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
Chaque c
personnage sera surligné en vert et chaque o
personnage sera surligné en rouge, etc ...
Pour que cet exemple fonctionne, vous devez vous assurer que vous disposez toujours
--color=always
de vos commandes grep. J'ai mis cela dans mon.bashrc
afin que grep ait toujours des couleurs:
export GREP_OPTIONS='--color=always'
Ce que j'essaie d'accomplir, c'est d'envelopper cette fonctionnalité avec un alias afin que je puisse simplement appeler grep
et avoir une GREP_COLORS
valeur différente à chaque fois. Je comprends la prise en compte de plusieurs shells pour chaque nouveau grep canalisé et j'essaie de surmonter cela en créant des fichiers (un pour chaque couleur), pour indiquer qu'ils ont déjà été utilisés.
J'ai fait quelques tentatives mais étrangement, celle-ci semble fonctionner "au mieux". J'ai ceci dans mon .bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
J'utilise cet alias comme ceci:
ll | mg c | mg o | mg n | mg f
Les résultats sont assez sympas. Il y a cependant des erreurs légèrement différentes à chaque fois. Voici quelques captures d'écran:
Il semble que lorsque le shell passe par chaque commande de canal, la fonction précédente n'a pas encore terminé son exécution. Il essaie de supprimer les fichiers qui n'existent plus. Je ne sais pas trop d'où command not found
viennent ces autres erreurs.
Comme vous pouvez le voir, j'ai mis quelques wait
commandes pour essayer de terminer la manipulation du fichier mais cela ne semble pas fonctionner trop bien. Une autre chose que j'ai déjà essayée est d'utiliser la mémoire partagée /dev/shm
mais elle a donné des résultats similaires.
Comment pourrais-je obtenir les résultats souhaités?
Remarque:
Je cherche des réponses qui enveloppent simplement la commande grep car elle a beaucoup de fonctionnalités que je veux utiliser et j'ai l'intention d'insérer une autre logique entre les canaux, donc je ne veux pas fournir tous les termes de recherche à la fois. Je ne suis pas non plus à la recherche d'autres outils "grep like". Désolé à @terdon qui a déjà posté une super suggestion de Perl.
alias mg="mygrep; grep"
?
mygrep;
se transforme en une nouvelle commande en soi et que le flux de données est perdu. Le tuyau entrant de la ls
serait transmis à mygrep;
et non à grep. C'est du moins ainsi que je le comprends.
--color=always
de toutes vos commandes grep. J'ai mis cela globalement dans mon .bashrc
. J'ai édité ça dans le post.