Avec le tri, vous pouvez trier les fichiers en fonction de l'ordre dans le dictionnaire ou par valeur numérique, randomiser les lignes de fichier, supprimer les lignes en double et vérifier si un fichier est trié.
Vous pourrez peut-être faire d'autres choses avec, mais d'abord, inquiétons-nous de savoir comment utiliser le tri dans les scripts bash.
Qu'est-ce que le tri?
Sort est une commande externe qui concatène les fichiers tout en triant leur contenu selon un type de tri et écrit les résultats du tri sur la sortie standard.
Options de commande de tri pour bash
La commande de tri est livrée avec 31 options (13 principales et 18 classées comme autres). La programmation bash la plus expérimentée (même les experts) ne connaît que quelques options de tri principales nécessaires pour s'en sortir. Les autres sont rarement touchés. Heureusement pour vous, nous avons le temps de les toucher tous.
Principales options de tri
Ce sont les options qui vous aident à faire avancer les choses et à trier (Tri) en plus de manipuler les résultats triés (Post-traitement) et d'appliquer des filtres (Filtres) avant le tri.
Tri
Sort est livré avec 5 types de tri différents. Voici un tableau montrant chaque type de tri avec les options associées.
Sorte | Option courte / option longue / etc mot |
Tri numérique (général) | -g / -general-numeric-sort général-numérique support pour la notation scientifique 0.1234e4 = 1234 |
Tri numérique (humain) | -h / -humain-numérique-sort humain-numérique 1.234K = 1234 |
Numérique | -n / -tri-numérique numérique … < -1 < 0 < 1 <… |
Mois | -M / -mois-sort mois Inconnu < Jan < Feb <… < Nov < Dec |
Aléatoire | -r / -tri aléatoire Aléatoire |
Version | -V / -version-sort version |
Notez que chaque type de tri a une longue option se terminant par -sort. En plus des options de tri spécifiques, l'option -sort=WORD peut être utilisée pour trier par mot. Par exemple -sort=random peut être utilisé à la place de -random-sort ou -r.
Exemples
Voici quelques exemples de commandes de tri pour chaque méthode de tri.
Exemple) Tri des noms
Le tri n'a aucun problème pour trier les lignes par ordre alphabétique. Considérez une liste de personnes célèbres non triées.
Une fonction
des personnes célèbres()curl --silencieux https://www.biographieen ligne.net/personnes/célèbres-100.html
| post-contenu grep | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
//1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'
Ligne de commande
célébrités | sorteProduction
Stephen King (1947 - )Steve Jobs (1955 - 2012)
Piqûre (1951 - )
Tiger Woods (1975 - )
Tom Cruise (1962 - )
Usain Bolt (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)
Exemple) Tri numérique général
Si nous devons trier des valeurs numériques en prenant en compte une notation scientifique telle que 99e2, nous pouvons utiliser un tri numérique général.
Une fonction
valeurs-numériques-non triées ()séquence 100 | sort --random-sort | '3i 9e2' | sed '3i 99K'
Considérez la sortie triée en utilisant chaque méthode. Notez qu'en plus de contenir les valeurs 1 à 100, la liste comprend également '9e12' (900) et '99K' (99000).
Ligne de commande
valeurs-numériques non triées | trier -nProduction
9697
98
99
99K
100
Qu'en est-il 900 et 99000. C'est vrai, c'est juste un tri numérique. Suivant.
Ligne de commande
valeurs-numériques non triées | trier -hProduction
9697
98
99
100
99K
Qu'en est-il 900. C'est vrai, c'est juste un tri numérique humain. Suivant.
Ligne de commande
valeurs-numériques-non triées | trier -gProduction
9697
98
99
99K
100
9e2
Qu'en est-il de 99000. C'est vrai, c'est juste un tri numérique général. Comme vous le voyez, aucune méthode de tri n'est compatible dans ce cas ; Cependant, cela ne signifie pas que vous ne pouvez pas trouver de solution.
Ligne de commande
valeurs-numériques non triées | sed 's/[kK]/e3/' | trier -gProduction
9697
98
99
100
9e2
99e3
Maintenant c'est plus comme ça.
Exemple) Tri numérique humain
Si nous devons trier des valeurs numériques en tenant compte de la signification de notations telles que K, G, M et E, nous pouvons utiliser le tri numérique humain.
Ligne de commande
séquence 100 | sort --random-sort | sed '3i 3k' | trier -hProduction
9697
98
99
100
3k
Exemple) Tri numérique
Si tout ce dont nous avons besoin est de trier les nombres entiers, le tri numérique fait l'affaire.
Ligne de commande
séquence 100 | sort --random-sort | sort --numerics-sortProduction
9596
97
98
99
100
Exemple) Tri par mois
Le tri par mois vous permet de trier les lignes par mois. Cela peut s'avérer utile pour regrouper les lignes par mois surtout dans le cas où l'option de tri par heure n'est pas disponible.
Une fonction
mois ()chat <
fév
Mar
avr
Mai
juin
juil
août
SEP
oct
nov
déc
FEO
Supposons que les mois ne soient pas triés.
Ligne de commande
mois | sort --random-sortProduction
Maroct
déc
avr
Mai
SEP
août
nov
juil
Jan
fév
juin
On peut toujours trier par mois.
Ligne de commande
mois | sort --random-sort | sort --mois-sortProduction
Janfév
Mar
avr
Mai
juin
juil
août
SEP
oct
nov
déc
Notez que si nous changeons Dec en n'importe quelle sous-chaîne en novembre, disons "Novem", il apparaîtra après "Nov" dans la sortie triée.
Exemple) Tri aléatoire - tue le terminal de quelqu'un d'autre
Comme prévu, le tri aléatoire fait le contraire du tri, mélange les lignes.
Supposons qu'à des fins éducatives, nous voulions tuer un autre utilisateur. Il faudrait s'assurer que ce n'est pas notre pty et randomiser les listings pour que ce soit plus joli et que l'on puisse dire que les ptys ont été choisis au hasard.
Commandes
message-pty ()pty local;
pty="$1"
;
echo -n "Vous descendez dans" > /dev/$pty;
pour i dans 5 4 3 2 1;
fais
dormir 1 ;
echo -n " $i" > /dev/$pty ;
Fini;
echo " Au revoir!" > /dev/$pty;
dormir 1
ps | grep pty | grep -v -e $( mypty ) | sort --random-sort | tête -1 > stdin;
message-pty $( pty < stdin );
tuer $( pid < stdin )
Sortie dans le terminal de quelqu'un d'autre
Tu descends dans 5 4 3 2 1 Bye!]
(sortir)
Exemple) Tri de version - ips de tri
Comme vous le savez, les fichiers source peuvent être versionnés à l'aide de chaînes telles que 1.0. De plus, les versions peuvent aller plus loin avec des numéros de version comme 1.0.0 comme vu dans les schémas de versions sémantiques populaires.
Le tri de version vous permet de trier les numéros de version. Génial! Maintenant quoi? Testons-le.
Pour cet exemple, j'ai préparé un script bash pour générer des ips aléatoires afin que nous n'ayons pas à y aller. C'est dans le repo. Pour ceux d'entre nous qui n'ont pas le repo, voici un démarrage rapide.
Commandes
git clone https://github.com/temptemp3/linuxhint.com.gitalias random-ips='test -f "linuxhint.com/generate-random-ips.sh" ; bash $_'
Maintenant que vous êtes prêt, commençons.
Ligne de commande
ips aléatoire 200 | tee ipsProduction
199.174.177.98180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.dix.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111
D'accord, ça marche. Voyons maintenant ce qui se passe lorsque nous essayons de trier les ips.
Ligne de commande
trier les ipsProduction
76.88.194.1578.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186
À première vue, cela semble fonctionner mais des lignes comme 8.96.11.181 devrait apparaître ailleurs.
Commandes
pour o in d h n V g M
fais
trier ips -$o > ips$o,,
Fini
echo tous les tris sont égaux à un tri numérique
diff ipsn,d 1>/dev/null || écho ordre du dictionnaire != tri numérique
diff ipsn,h 1>/dev/null || echo tri numérique humain != tri numérique
diff ipsn,g 1>/dev/null || echo tri numérique général != tri numérique
diff ipsn,v 1>/dev/null ||
trier les versions d'écho != tri numérique
show_n_v_ips_diff="true"
test ! "$show_n_v_ips_diff" || diff ipsn,v
Production
toutes sortes de tri numérique égalordre du dictionnaire != tri numérique
tri des versions != tri numérique
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40
Comme vous le voyez, le tri des versions vous permet de trier les numéros de version lorsque d'autres méthodes de tri échouent.
Exemple) Tri de version - tri des noms de fichiers avec les numéros de version
Sur la base du dernier exemple, utilisons le tri de version un peu plus près de son utilisation prévue. Comme vous le savez, les numéros de version apparaissent généralement dans les noms de fichiers. Voir les détails sur le tri des versions.
Tout d'abord, transformons ips en quelque chose d'autre fichier source de projet comme.
Commandes
alpha ()alpha="abcdefghijklmnopqrstuvwxyz" ;
echo -n $alpha:$(( RANDOM % 26 )):1
bêta ()
alpha="ab" ;
echo -n $alpha:$(( RANDOM % 2 )):1
chat ip | lors de la lecture de la ligne -r ; fais
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || bêta).le goudron.gz;
fait | tee gorgées
Production
x-v56.16.109.54.le goudron.gzk-v117.38.14.165a.le goudron.gz
d-v87.59.32.91a.le goudron.gz
h-v115.215.64.100.le goudron.gz
s-v72.174.246.218b.le goudron.gz
h-v163.93.19.173.le goudron.gz
u-v184.225.11.92b.le goudron.gz
y-v205.53.5.211a.le goudron.gz
t-v175.196.164.17b.le goudron.gz
e-v167.42.221.178b.le goudron.gz
c-v126.54.190.189b.le goudron.gz
b-v169.180.221.131a.le goudron.gz
y-v210.125.170.231a.le goudron.gz
x-v71.56.120.9b.le goudron.gz
Exercer
Faites en sorte que les commandes ci-dessus s'exécutent plus rapidement à l'aide de xargs
Voir l'exemple sur l'utilisation de la commande xargs dans les scripts bash.
Cette fois, nous ne prendrons même pas la peine d'utiliser l'une des autres méthodes de tri.
Ligne de commande
trier -V gorgéesProduction
d-v127.100.108.192.le goudron.gze-v62.140.229.42a.le goudron.gz
e-v149.77.211.215a.le goudron.gz
e-v167.42.221.178b.le goudron.gz
e-v194.189.236.29a.le goudron.gz
e-v198.145.199.84b.le goudron.gz
e-v240.1.147.196b.le goudron.gz
f-v50.100.142.42b.le goudron.gz
f-v117.58.230.116.le goudron.gz
f-v139.17.210.68b.le goudron.gz
f-v153.18.145.133b.le goudron.gz
g-v201.153.203.60b.le goudron.gz
g-v213.58.67.108.le goudron.gz
h-v5.206.37.224.le goudron.gz
Vous voyez maintenant que le tri de version peut être utile lors du tri des noms de fichiers avec des numéros de version.
Pré-tri
Sort a quatre options principales qui affectent le tri réel, à savoir -ignore-leader-blanks, -ignore-case, -ignore-nonprinting et -dictionary-order, qui peuvent ou non se chevaucher. Exemple utilisant chaque option suivre.
Trier en ignorant les blancs de début
Le tri permet d'ignorer les blancs de début d'entrée en option. Les blancs de tête sont conservés dans la sortie triée.
Option
--ignorer-les-blancsUsage
sort --ignore-leader-blanksCommandes
célébrités > fpchat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier | tac
Production
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Notez que les espaces de début des lignes ajoutées à fp apparaissent en premier dans la sortie du tri.
Pour résoudre ce problème, nous devons ignorer les blancs de début comme suit.
Commandes
célébrités > fpchat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier --ignore-leading-blanks --ignore-leading-blanks | tac
Production
Marilyn Monroe (1926 - 1962)Marilyn Monroe (1926 - 1962)
Marie-Antoinette (1755 - 1793)
…
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Alternatives
chat fp | sed 's/^\s*//' | trier | tacNotez que l'alternative ne préserve pas les blancs de début dans la sortie de tri.
Trier en ignorant la casse
Le tri permet d'ignorer la casse d'entrée en option. La casse est conservée dans la sortie triée.
Option
--ignorer la casseUsage
trier --ignore-caseCommandes
célébrités > fpchat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier | tac
Production
Amélie Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Notez que les espaces de début dans les lignes ajoutées à fp apparaissent en premier dans la sortie du tri.
Pour résoudre ce problème, nous devons ignorer les blancs de début comme suit.
Commandes
célébrités > fpchat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier --ignore-case | tac
Production
Amélie Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Alternatives
chat fp | pendant la lecture -r ligne ; faire echo $ligne,, ; fait | trier | tacNotez que l'alternative ne préserve pas la casse dans la sortie de tri.
Trier en ignorant la non-impression
Le tri permet d'ignorer l'entrée non imprimable en option. La non impression est préservée dans la sortie triée.
Option
--ignorer-non-impressionUsage
sort --ignore-nonprintingCommandes
célébrités > fpecho -e "\x90Abe" >> fp
chat fp | trier | tac
Production
Audrey Hepburn (1929 - 1993)Angelina Jolie (1975 - )
Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
On dirait qu'il nous manque un "Abe" pour les caractères non imprimables dans l'entrée de tri.
Pour résoudre ce problème, nous devons ignorer les caractères non imprimables.
Commandes
célébrités > fpecho -e "\x90Abe" >> fp
chat fp | sort --ignore-nonprinting | tac
[/cc\
Production
[cc lang="bash"]
Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe
Trier l'ordre du dictionnaire
Le tri permet d'ignorer toutes les entrées, à l'exception des espaces et des caractères alphanumériques en option. L'entrée est conservée dans la sortie triée.
célébrités > fpecho -e "\x90Abe" >> fp
chat fp | trier --d | tac
Trier les messages
Sort a une option principale qui n'affecte pas le tri, à savoir -reverse. Cependant, cela affecte la sortie, permettant de basculer l'ordre entre ascendant et descendant. Un exemple suit.
Trier la sortie inversée
Le tri permet d'afficher la sortie dans l'ordre inverse en option.
Option
--sens inverseUsage
trier --reverseLigne de commande
célébrités | trier --reverseProduction
Angelina Jolie (1975 - )Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Alternatives
trier | tacAutres options de tri
Il y a vingt-deux autres options de tri. Des exemples suivent.
Trier le chèque
Sort a une option qui vous permet de vérifier si l'entrée est triée. Il retourne après la première instance d'une ligne non triée. Si l'entrée doit être triée mais est probablement déjà en ordre, l'utilisation du contrôle de tri est appropriée.
Option
--ChèqueUsage
trier --vérifierLigne de commande
séquence 10 | sort --random-sort | trier --vérifierProduction
tri : -:3 : désordre : 10Ligne de commande
séquence 10 | sort --random-sort | trier | trier --vérifierProduction
(Vide)Sortie de tri
Sort a une option qui vous permet de spécifier un fichier dans lequel écrire au lieu d'utiliser la sortie standard ou la redirection. Son utilisation peut améliorer la compatibilité entre les environnements de script.
Option
--sortie=FICHIERUsage
tri --output=FICHIERLigne de commande
séquence 10 | sort --random-sort --output=random-10Production
(Vide)Tri nul terminé
Sort a une option qui vous permet de définir le délimiteur de ligne sur null au lieu d'un saut de ligne.
Option
--zéro-terminéUsage
trier --terminé par zéroLigne de commande
séquence 10 | tr '\012' '\000' | sort --terminé par zéro --random-sortProduction
25346178910Trier stable
Sort a une option qui vous permet de désactiver la comparaison de dernier recours. En conséquence, des temps d'exécution plus stables peuvent être obtenus dans le cas d'entrées suffisamment importantes qui pourraient rendre le tri instable.
Option
--stableUsage
trier --stableLigne de commande
séquence temporelle 1000000 | sort --random-sort | sort --stable >/dev/nullProduction
réel 0m9.138sutilisateur 0m9.201s
sys 0m0.107s
Trier la taille du tampon
Sort a une option qui vous permet de définir la quantité de mémoire utilisée comme tampon lors du tri. Il peut être utilisé pour limiter la consommation de mémoire en triant des entrées plus importantes. Les performances peuvent être affectées.
Option
--buffer-size=TAILLEUsage
sort --buffer-size=64Ligne de commande
séquence temporelle 1000000 | trier -trier-aléatoirement | sort -stable -buffer-size=64 >/dev/null
Production
réel 0m21.685sutilisateur 0m9.858s
sys 0m2.092s
Trier unique
Sort a une option qui vous permet de supprimer les lignes en double dans la sortie de tri
Option
--uniqueUsage
trier --uniqueLigne de commande écho 1 2 2 4 5 | tr '\040' '\000' | sort --terminé par zéro --unique
Production
1245Alternatives
trier | uniqueConclusion
Sort est une commande externe utile non seulement lorsqu'elle est utilisée en combinaison avec d'autres commandes externes, mais est également pratique lorsqu'elle est utilisée avec des commandes sans méthode de classement intégrée, comme une fonction définie par l'utilisateur ou des scripts bash en général.