Mit sort können Sie Dateien basierend auf der Reihenfolge im Wörterbuch oder nach numerischen Werten sortieren, Dateizeilen randomisieren, doppelte Zeilen entfernen und prüfen, ob eine Datei sortiert ist.
Sie können vielleicht andere Dinge damit machen, aber zuerst wollen wir uns darum kümmern, wie man sort in Bash-Skripten verwendet.
Was ist sortiert?
Sortieren ist ein externer Befehl, der Dateien verkettet, während deren Inhalt nach einem Sortiertyp sortiert wird, und die Sortierergebnisse in die Standardausgabe schreibt.
Befehlsoptionen für bash sortieren
Der Sortierbefehl enthält 31 Optionen (13 Haupt- und 18 als andere kategorisiert). Die meisten erfahrenen Bash-Programmierer (sogar Experten) kennen nur wenige Hauptsortieroptionen, die erforderlich sind, um zurechtzukommen. Andere werden selten berührt. Zum Glück haben wir Zeit, sie alle anzufassen.
Hauptsortieroptionen
Dies sind die Optionen, die Ihnen helfen, Dinge zu erledigen und zu sortieren (Sortieren), sowie sortierte Ergebnisse zu manipulieren (Nachbearbeitung) und Filter anzuwenden (Filter) vor dem Sortieren.
Sortierung
Sort kommt mit 5 verschiedenen Sortierarten. Hier ist eine Tabelle, die jeden Sortiertyp mit den zugehörigen Optionen zeigt.
Sortieren | Kurze Option / Lange Option / etc Wort |
Numerische Sortierung (allgemein) | -g / -general-numeric-sort allgemein-numerisch Unterstützung für wissenschaftliche Notation 0.1234e4 = 1234 |
Numerische Sortierung (Mensch) | -h / -human-numeric-sort menschlich-numerisch 1.234K = 1234 |
Numerisch | -n / -numerisch-sortieren numerisch … < -1 < 0 < 1 <… |
Monat | -M / -Monatssortierung Monat Unbekannt < Jan < Feb <… < Nov < Dec |
Zufällig | -r / -zufällige Sortierung zufällig |
Ausführung | -V / -version-sortieren Ausführung |
Beachten Sie, dass jeder Sortiertyp eine lange Option hat, die mit -sort endet. Zusätzlich zu bestimmten Sortieroptionen kann die Option -sort=WORD verwendet werden, um nach Wörtern zu sortieren. Zum Beispiel kann -sort=random anstelle von -random-sort oder -r . verwendet werden.
Beispiele
Hier sind einige Beispiele für Sortierbefehle für jede Sortiermethode.
Beispiel) Namen sortieren
Sortieren hat keine Probleme, Zeilen alphabetisch zu sortieren. Betrachten Sie eine Liste berühmter Personen, die nicht sortiert sind.
Funktion
berühmte Menschen()curl --still https://www.biografieonline.Netto/Menschen/berühmt-100.html
| grep-Beitragsinhalt | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'
Befehlszeile
berühmte-leute | SortierenAusgabe
Stephen King (1947 - )Steve Jobs (1955 - 2012)
Stachel (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)
Beispiel) Allgemeine numerische Sortierung
Wenn wir numerische Werte unter wissenschaftlicher Notation wie 99e2 sortieren müssen, können wir die allgemeine numerische Sortierung verwenden.
Funktion
unsortierte-numerische-Werte ()Sequenz 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'
Betrachten Sie die sortierte Ausgabe mit jeder Methode. Beachten Sie, dass die Liste neben den Werten 1 bis 100 auch '9e12' (900) und '99K' (99000) enthält.
Befehlszeile
unsortierte-numerische-Werte | sortieren -nAusgabe
9697
98
99
99K
100
Was ist mit 900 und 99000. Das ist richtig, es ist nur eine numerische Sortierung. Nächster.
Befehlszeile
unsortierte-numerische-Werte | sortieren -hAusgabe
9697
98
99
100
99K
Was ist mit 900. Das ist richtig, es ist nur eine menschliche numerische Sortierung. Nächster.
Befehlszeile
unsortierte-numerische-Werte | sortieren -gAusgabe
9697
98
99
99K
100
9e2
Was ist mit 99000. Das ist richtig, es ist nur eine allgemeine numerische Sortierung. Wie Sie sehen, ist in diesem Fall keine Sortiermethode kompatibel; Das bedeutet jedoch nicht, dass Sie keine Lösung finden können.
Befehlszeile
unsortierte-numerische-Werte | sed 's/[kK]/e3/' | sortieren -gAusgabe
9697
98
99
100
9e2
99e3
Das ist jetzt eher so.
Beispiel) Menschliche numerische Sortierung
Wenn wir numerische Werte unter Berücksichtigung der Bedeutung von Notationen wie K, G, M und E sortieren müssen, können wir die menschliche numerische Sortierung verwenden.
Befehlszeile
Sequenz 100 | sort --random-sort | sed '3i 3k' | sortieren -hAusgabe
9697
98
99
100
3k
Beispiel) Numerische Sortierung
Wenn wir nur ganze Zahlen sortieren müssen, reicht die numerische Sortierung aus.
Befehlszeile
Sequenz 100 | sort --random-sort | sort --numerics-sortAusgabe
9596
97
98
99
100
Beispiel) Monatssortierung
Mit der Monatssortierung können Sie Zeilen nach Monat sortieren. Es könnte sich als nützlich erweisen, Zeilen nach Monaten zu gruppieren, insbesondere wenn die Option zum Sortieren nach Zeit nicht verfügbar ist.
Funktion
Monate ()Katze <
Februar
Beschädigen
April
Kann
Juni
Juli
August
September
Okt
November
Dezember
EOF
Angenommen, die Monate sind nicht sortiert.
Befehlszeile
Monate | sort --random-sortAusgabe
BeschädigenOkt
Dezember
April
Kann
September
August
November
Juli
Jan
Februar
Juni
Wir können immer nach Monat sortieren.
Befehlszeile
Monate | sort --random-sort | sort --MonatssortierungAusgabe
JanFebruar
Beschädigen
April
Kann
Juni
Juli
August
September
Okt
November
Dezember
Beachten Sie, dass, wenn wir Dec im November in einen beliebigen Teilstring ändern, sagen wir 'Novem', dieser nach 'Nov' in der sortierten Ausgabe erscheint.
Beispiel) Zufällige Sortierung – töte das Terminal eines anderen
Wie erwartet bewirkt die zufällige Sortierung das Gegenteil der Sortierung, sie verwechselt Zeilen.
Angenommen, wir wollen zu Bildungszwecken einen anderen Benutzer töten. Wir müssten sicherstellen, dass es nicht unser Pty ist, und die Angebote randomisieren, damit es schöner ist und wir sagen können, dass Ptys zufällig ausgewählt wurden.
Befehle
nachricht-pty ()lokale Pty;
pty="$1"
;
echo -n "Du gehst runter" > /dev/$pty;
für i in 5 4 3 2 1;
tun
Schlaf 1;
echo -n " $i" > /dev/$pty;
getan;
echo " Tschüss!" > /dev/$pty;
Schlaf 1
ps | grep pty | grep -v -e $( mypty ) | sort --random-sort | Kopf -1 > Standard;
Nachricht-pty $( pty < stdin );
töten $( pid < stdin )
Ausgabe im Terminal einer anderen Person
Du gehst in 5 4 3 2 1 Tschüss unter!]
(Ausfahrt)
Beispiel) Version sortieren - ips sortieren
Wie Sie wissen, können Quelldateien mit Zeichenfolgen wie 1 . versioniert werden.0. Darüber hinaus können Versionen mit Versionsnummern wie 1 . tiefer gehen.0.0, wie sie in gängigen semantischen Versionsschemata zu sehen ist.
Versionssortierung ermöglicht das Sortieren von Versionsnummern. Groß! Was jetzt? Lass es uns testen.
Für dieses Beispiel habe ich ein Bash-Skript vorbereitet, um zufällige IPs zu generieren, damit wir nicht dorthin gehen müssen. Es ist im Repository. Für diejenigen von uns, die das Repo nicht haben, ist hier ein Schnellstart.
Befehle
git-Klon https://github.com/temptemp3/linuxhint.com.gitalias random-ips='test -f "linuxhint.com/generate-random-ips.sh" ; bash $_'
Jetzt, wo du bereit bist, lass uns loslegen.
Befehlszeile
random-ips 200 | Tee ipsAusgabe
199.174.177.98180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111
Okay, es funktioniert. Mal sehen, was passiert, wenn wir versuchen, ips zu sortieren.
Befehlszeile
ips sortierenAusgabe
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
Auf den ersten Blick scheint es zu funktionieren, aber Linien wie 8.96.11.181 sollte woanders erscheinen.
Befehle
für o in d h n V g M
tun
ips sortieren -$o > ips$o,,
getan
echo alle Arten gleich numerisch sortieren
diff ipsn,d 1>/dev/null || Echo-Wörterbuchreihenfolge != numerische Sortierung
diff ipsn,h 1>/dev/null || Echo menschliche numerische Sortierung != numerische Sortierung
diff ipsn,g 1>/dev/null || Echo allgemeine numerische Sortierung != numerische Sortierung
diff ipsn,v 1>/dev/null ||
Echo-Version sortieren != numerische Sortierung
show_n_v_ips_diff="wahr"
Prüfung ! "$show_n_v_ips_diff" || Diff-IPsn,v
Ausgabe
alle Sorten gleich numerische SortierungWörterbuchbestellung != numerische Sortierung
Version sortieren != numerische Sortierung
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
Wie Sie sehen, können Sie Versionsnummern sortieren, wenn andere Sortiermethoden fehlschlagen.
Beispiel) Version sortieren - Sortieren von Dateinamen mit Versionsnummern
Aufbauend auf dem letzten Beispiel verwenden wir version sort etwas näher an der beabsichtigten Verwendung. Wie Sie wissen, erscheinen Versionsnummern häufig in Dateinamen. Siehe Details zur Versionssortierung.
Lassen Sie uns zunächst ips in eine andere Projektquelldatei wie umwandeln.
Befehle
alpha ()alpha="abcdefghijklmnopqrstuvwxyz";
echo -n $alpha:$(( ZUFALL % 26 )):1
Beta ()
alpha="ab";
echo -n $alpha:$(( ZUFALL % 2 )):1
Katzen-IPs | while read -r Zeile; tun
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).Teer.gz;
fertig | Tee Schlucke
Ausgabe
x-v56.16.109.54.Teer.gzk-v117.38.14.165a.Teer.gz
d-v87.59.32.91a.Teer.gz
h-v115.215.64.100.Teer.gz
s-v72.174.246.218b.Teer.gz
h-v163.93.19.173.Teer.gz
u-v184.225.11.92b.Teer.gz
y-v205.53.5.211a.Teer.gz
t-v175.196.164.17b.Teer.gz
e-v167.42.221.178b.Teer.gz
c-v126.54.190.189b.Teer.gz
b-v169.180.221.131a.Teer.gz
y-v210.125.170.231a.Teer.gz
x-v71.56.120.9b.Teer.gz
Übung
Machen Sie die obigen Befehle mit xargs schneller
Siehe Beispiel zur Verwendung des xargs-Befehls in Bash-Skripten.
Diesmal werden wir uns nicht einmal die Mühe machen, eine der anderen Sortiermethoden zu verwenden.
Befehlszeile
sortieren -V SchluckeAusgabe
d-v127.100.108.192.Teer.gze-v62.140.229.42a.Teer.gz
e-v149.77.211.215a.Teer.gz
e-v167.42.221.178b.Teer.gz
e-v194.189.236.29a.Teer.gz
e-v198.145.199.84b.Teer.gz
e-v240.1.147.196b.Teer.gz
f-v50.100.142.42b.Teer.gz
f-v117.58.230.116.Teer.gz
f-v139.17.210.68b.Teer.gz
f-v153.18.145.133b.Teer.gz
g-v201.153.203.60b.Teer.gz
g-v213.58.67.108.Teer.gz
h-v5.206.37.224.Teer.gz
Jetzt sehen Sie, dass die Versionssortierung beim Sortieren von Dateinamen mit Versionsnummern nützlich sein kann.
Vorsortieren
Sortieren hat vier Hauptoptionen, die sich auf die tatsächliche Sortierung auswirken, nämlich -führende Leerzeichen ignorieren, -Groß-/Kleinschreibung ignorieren, -Nichtdrucken ignorieren und -Wörterbuchreihenfolge, die sich überschneiden können oder nicht. Beispiel mit jeder Option folgen.
Sortieren, führende Leerzeichen ignorieren
Mit Sortieren können führende Leerzeichen bei der Eingabe als Option ignoriert werden. Führende Leerzeichen bleiben in der sortierten Ausgabe erhalten.
Möglichkeit
--ignoriere-führende-LeerzeichenVerwendung
sortieren --ignore-leading-blanksBefehle
berühmte-leute > fpKatze >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren | tac
Ausgabe
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Beachten Sie, dass führende Leerzeichen in Zeilen, die zu fp hinzugefügt wurden, zuerst in der Sortierausgabe erscheinen.
Um dies zu beheben, müssen wir führende Leerzeichen wie folgt ignorieren.
Befehle
berühmte-leute > fpKatze >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren --ignore-leading-blanks --ignore-leading-blanks | tac
Ausgabe
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)
Alternativen
Katze fp | sed 's/^\s*//' | sortieren | tacBeachten Sie, dass die Alternative führende Leerzeichen in der Sortierausgabe nicht beibehält.
Sortieren, Groß-/Kleinschreibung ignorieren
Durch Sortieren kann die Groß-/Kleinschreibung optional ignoriert werden. Der Fall bleibt in der sortierten Ausgabe erhalten.
Möglichkeit
--Fall ignorierenVerwendung
sortieren --ignore-caseBefehle
berühmte-leute > fpKatze >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren | tac
Ausgabe
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Beachten Sie, dass führende Leerzeichen in Zeilen, die zu fp hinzugefügt wurden, zuerst in der Sortierausgabe erscheinen.
Um dies zu beheben, müssen wir führende Leerzeichen wie folgt ignorieren.
Befehle
berühmte-leute > fpKatze >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren --ignore-case | tac
Ausgabe
Amelia 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)
Alternativen
Katze fp | while read -r Zeile ; echo $line,, ; fertig | sortieren | tacBeachten Sie, dass die Alternative die Groß-/Kleinschreibung in der Sortierausgabe nicht beibehält.
Nicht druckbare Sortierung ignorieren
Sortieren ermöglicht, dass Eingaben, die nicht gedruckt werden, als Option ignoriert werden as. Nichtdrucken wird in der sortierten Ausgabe beibehalten.
Möglichkeit
--ignorieren-nicht druckenVerwendung
sort --ignore-nonprintingBefehle
berühmte-leute > fpecho -e "\x90Abe" >> fp
Katze fp | sortieren | tac
Ausgabe
Audrey Hepburn (1929 - 1993)Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Anscheinend fehlt ein 'Abe' für nicht druckbare Zeichen in der Sortiereingabe.
Um dies zu beheben, müssen wir nicht druckbare Zeichen ignorieren.
Befehle
berühmte-leute > fpecho -e "\x90Abe" >> fp
Katze fp | sort --ignore-nonprinting | tac
[/cc\
Ausgabe
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe
Wörterbuchreihenfolge sortieren
Mit Sortieren können alle Eingaben außer Leerzeichen und alphanumerischen Zeichen als Option ignoriert werden. Eingaben bleiben in der sortierten Ausgabe erhalten.
berühmte-leute > fpecho -e "\x90Abe" >> fp
Katze fp | sortieren --d | tac
Post sortieren
Sortieren hat eine Hauptoption, die sich nicht auf die Sortierung auswirkt, nämlich -reverse. Es wirkt sich jedoch auf die Ausgabe aus, sodass die Reihenfolge zwischen aufsteigend und absteigend umgeschaltet werden kann. Es folgt ein Beispiel.
Umgekehrte Ausgabe sortieren
Mit Sortieren kann die Ausgabe optional in umgekehrter Reihenfolge angezeigt werden.
Möglichkeit
--umkehrenVerwendung
sortieren – umkehrenBefehlszeile
berühmte-leute | sortieren – umkehrenAusgabe
Angelina Jolie (1975 - )Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Alternativen
sortieren | tacAndere Sortieroptionen
Es gibt zweiundzwanzig andere Optionen für die Sortierung. Beispiele folgen.
Scheck sortieren
Sortieren hat eine Option, mit der Sie überprüfen können, ob die Eingabe sortiert ist. Es kehrt nach der ersten Instanz einer unsortierten Zeile zurück. Für den Fall, dass die Eingabe sortiert werden muss, aber wahrscheinlich bereits in Ordnung ist, ist die Verwendung der Sortierprüfung geeignet.
Möglichkeit
--prüfenVerwendung
sortieren --checkBefehlszeile
seq 10 | sort --random-sort | sortieren --checkAusgabe
sortieren: -:3: Unordnung: 10Befehlszeile
seq 10 | sort --random-sort | sortieren | sortieren --checkAusgabe
(leer)Ausgabe sortieren
Sortieren hat eine Option, mit der Sie eine Datei angeben können, in die geschrieben werden soll, anstatt die Standardausgabe oder Umleitung zu verwenden. Seine Verwendung kann die Kompatibilität zwischen Skriptumgebungen verbessern.
Möglichkeit
--Ausgabe=DATEIVerwendung
sort --output=DATEIBefehlszeile
seq 10 | sort --random-sort --output=random-10Ausgabe
(leer)Sortieren null beendet
Sortieren hat eine Option, mit der Sie das Zeilentrennzeichen auf Null anstelle eines Zeilenumbruchs setzen können.
Möglichkeit
--nullterminiertVerwendung
sort --null-terminiertBefehlszeile
seq 10 | tr '\012' '\000' | sort --null-terminiert --random-sortAusgabe
25346178910Stabil sortieren
Sortieren hat eine Option, mit der Sie den Vergleich der letzten Instanz deaktivieren können. Dadurch können bei ausreichend großen Eingaben stabilere Laufzeiten erreicht werden, die dazu führen können, dass sort instabil läuft.
Möglichkeit
--stabilVerwendung
sortieren --stableBefehlszeile
Zeitseq 1000000 | sort --random-sort | sort --stable >/dev/nullAusgabe
echt 0m9.138sNutzer 0m9.201s
sys 0m0.107s
Puffergröße sortieren
Sortieren hat eine Option, mit der Sie die Menge an Speicher festlegen können, die beim Sortieren als Puffer verwendet wird. Es kann verwendet werden, um den Speicherverbrauch beim Sortieren größerer Eingaben zu begrenzen. Leistung kann beeinträchtigt sein.
Möglichkeit
--Puffergröße=GRÖSSEVerwendung
sortieren --buffer-size=64Befehlszeile
Zeitseq 1000000 | sortieren -zufällig-sortieren | sort -stable -buffer-size=64 >/dev/null
Ausgabe
echt 0m21.685sNutzer 0m9.858s
sys 0m2.092s
Einzigartig sortieren
Sortieren hat eine Option, mit der Sie doppelte Zeilen in der Sortierausgabe entfernen können
Möglichkeit
--einzigartigVerwendung
sortieren --einzigartigBefehlszeile Echo 1 2 2 4 5 | tr '\040' '\000' | sort --null-terminiert --unique
Ausgabe
1245Alternativen
sortieren | einzigartigFazit
Sort ist ein externer Befehl, der nicht nur in Kombination mit anderen externen Befehlen nützlich ist, sondern auch praktisch, wenn er mit Befehlen ohne integrierte Sortiermethode verwendet wird, wie z. B. einer benutzerdefinierten Funktion oder Bash-Skripten im Allgemeinen.