Sortieren und Filtern von Dateien: Befehle sort
, uniq
, cut
1. Befehl sort
Der Befehl sort
wird verwendet, um Zeilen in einer Textdatei zu sortieren. Er funktioniert mit jedem Textformat: von einfachem Plaintext bis hin zu CSV. Standardmäßig sortiert er Zeilen alphabetisch. Aber es gibt viele Optionen, mit denen du echte Wunder bewirken kannst.
Grundlegende Syntax
sort [optionen] datei
Einfaches Beispiel
Angenommen, wir haben eine Datei names.txt
mit folgendem Inhalt:
Charlie
Alice
Bob
David
Wir können sie alphabetisch so sortieren:
sort names.txt
Ergebnis:
Alice
Bob
Charlie
David
Wichtige Optionen für sort
Sortierung in umgekehrter Reihenfolge
Wenn du Zeilen in absteigender Reihenfolge sortieren möchtest, benutze die Option -r
:
sort -r names.txt
Ergebnis:
David
Charlie
Bob
Alice
Numerische Sortierung
Für Zahlen kann eine alphabetische Sortierung falsch sein. Zum Beispiel der Inhalt der Datei numbers.txt
:
10
2
5
1
Die alphabetische Sortierung ergibt:
1
10
2
5
Aber mit der Option -n
(numerische Sortierung):
sort -n numbers.txt
Das Ergebnis wird korrekt sein:
1
2
5
10
Leerzeichen ignorieren
Manchmal enthalten Zeilen Leerzeichen am Anfang oder Ende. Um sort
nicht zu verwirren, benutze die Option -b
:
sort -b schmutzige_datei.txt
Beispiel
Angenommen, wir haben ein Protokoll von Website-Besuchen besuche.log
:
user2 15
user1 5
user3 30
user4 20
Wir möchten die Benutzer nach der Anzahl der Besuche (zweite Spalte) sortieren. Das geht so:
sort -k2 -n besuche.log
Hier bedeutet -k2
"die zweite Spalte für die Sortierung verwenden". Ergebnis:
user1 5
user2 15
user4 20
user3 30
2. Der Befehl uniq
Der Befehl uniq
entfernt doppelte Zeilen in einer Datei. Es ist jedoch wichtig zu beachten: Er funktioniert nur mit aufeinander folgenden Duplikaten. Das bedeutet, wenn identische Zeilen in verschiedenen Teilen der Datei vorkommen, müssen diese zuerst sortiert werden.
Grundlegende Syntax
uniq [optionen] datei
Ein einfaches Beispiel
Angenommen, wir haben eine Datei colors.txt
:
rot
grün
grün
blau
blau
blau
rot
Wenn wir einfach uniq
verwenden:
uniq colors.txt
Das Ergebnis wird sein:
rot
grün
blau
rot
Entfernen von unvermeidlichen Duplikaten
Zuerst sortieren wir die Datei:
sort colors.txt | uniq
Ergebnis:
blau
grün
rot
Wichtige Optionen von uniq
Zählen von Wiederholungen
Wenn du wissen möchtest, wie oft jede Zeile vorkommt, benutze die Option -c
:
sort colors.txt | uniq -c
Ergebnis:
3 blau
2 grün
2 rot
Beispiel
In der Datei access.log
haben wir eine Liste von IP-Adressen:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
Wir wollen herausfinden, welche IP-Adresse am häufigsten vorkam:
sort access.log | uniq -c | sort -rn
Ergebnis:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. Der Befehl cut
Der Befehl cut
ermöglicht es, bestimmte Teile von Zeilen zu extrahieren, wie z.B. einzelne Spalten in einer CSV-Datei oder Bereiche von Zeichen.
Grundlegende Syntax
cut [Optionen] Datei
Ein einfaches Beispiel
Datei data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
Wir extrahieren nur die Namen (die erste Spalte):
cut -d',' -f1 data.csv
Ergebnis:
Alice
Bob
Charlie
Wobei:
-d','
— Trennzeichen (Komma).-f1
— Feld (Spalte) zum Extrahieren.
Wichtige Optionen von cut
Auswahl von Zeichenbereichen
Wenn unsere Datei data.csv
Spalten mit fester Breite enthält:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
Können wir nur das Alter extrahieren (Zeichen 12 bis 14):
cut -c12-14 data.csv
Ergebnis:
25
30
22
Auswahl mehrerer Felder
Wenn wir eine Datei log.csv
haben:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
Wählen wir nur das Datum und die Log-Ebene (Felder 1 und 2):
cut -d',' -f1,2 log.csv
Ergebnis:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. Praktisches Beispiel: Kombination von sort
, uniq
und cut
Wir nehmen eine Log-Datei mit folgenden Daten:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- IP-Adressen extrahieren:
cut -d',' -f2 log.txt
- Duplikate entfernen und zählen:
cut -d',' -f2 log.txt | sort | uniq -c
- Nach Anzahl der Vorkommen sortieren:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
Ergebnis:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION