- Lernen
- Informatik & Informationswissenschaften
- IT, Netzwerke & Cloud
- Linux – Befehlszeile, Shellskripte und Systemverwaltung
- Linux-Pipes und Textverarbeitung
Umleitung, Linux-Pipes und Textverarbeitung
AnfängerEinheit 3 von 7 in Kurs: Linux – Befehlszeile, Shellskripte und Systemverwaltung
Was du lernst
- Kurze Dateien vollständig anzeigen, lange Dateien seitenweise durchsehen und nur die ersten oder letzten Zeilen einer Datei anzeigen.
- Dateien mit cat und less anzeigen und seitenweise durchsehenKurze Dateien mit cat ausgeben, lange Dateien mit less bildschirmweise lesen und sich in less bewegen und suchen.
- Die ersten oder letzten Zeilen mit head und tail anzeigenMit head und tail den Anfang oder das Ende einer Datei anzeigen, eine Kopfzeile überspringen, einen Zeilenbereich auswählen und eine wachsende Protokolldatei verfolgen.
- Dateien mit cat und less anzeigen und seitenweise durchsehen
- Die drei Standardströme eines Befehls erklären und Eingaben, Ausgaben und Fehlermeldungen von und in Dateien umleiten.
- Standardeingabe, Standardausgabe und Standardfehlerausgabe verstehenDie drei Standardströme beschreiben, erklären, warum Ausgaben und Fehler getrennt sind, und zeigen, wie ein Befehl seine Eingabe statt von der Tastatur aus einer Datei lesen kann.
- Ausgaben und Fehlermeldungen in Dateien umleitenAusgaben und Fehlermeldungen durch Überschreiben oder Anhängen in Dateien speichern, Datenströme zusammenführen oder verwerfen und vermeiden, eine Datei durch Umleitung auf sich selbst zu zerstören.
- Standardeingabe, Standardausgabe und Standardfehlerausgabe verstehen
- Kleine Befehle mit Pipes verbinden, um Text zu zählen, zu sortieren, Duplikate zu entfernen und Text auszuschneiden und so Fragen zu Daten mit einer einzigen Befehlszeile zu beantworten.
- Befehle mit Pipes und tee verbindenMit einer Pipe die Ausgabe eines Befehls an den nächsten weitergeben, eine Pipeline schrittweise aufbauen und prüfen und mit tee unterwegs eine Kopie speichern.
- Zeilen zählen, sortieren und doppelte Zeilen entfernenZeilen, Wörter und Bytes mit wc zählen, Zeilen mit sort alphabetisch, numerisch oder nach einem Feld ordnen und mit uniq Duplikate entfernen oder zählen.
- Spalten mit cut extrahierenMit cut Felder aus Text mit Trennzeichen und Zeichen an festen Positionen auswählen und den Befehl in Pipelines verwenden, um Fragen zu Daten zu beantworten.
- Befehle mit Pipes und tee verbinden
- Mit grep Zeilen in Dateien finden und den gesuchten Text mit einfachen und erweiterten regulären Ausdrücken präzise beschreiben.
- Dateien mit grep und seinen wichtigsten Optionen durchsuchenMit grep passende Zeilen ausgeben, zählen oder nummerieren oder die Suche umkehren, ganze Verzeichnisse durchsuchen und zwischen Muster- und Festtextsuche wählen.
- Einfache reguläre Ausdrücke schreibenMuster aus literalen Zeichen, dem Punkt, Ankern, Klammerausdrücken und dem Stern aufbauen und sie nicht mit Platzhaltern für Dateinamen verwechseln.
- Erweiterte reguläre Ausdrücke mit grep -E verwendenMit grep -E die Operatoren ?, +, { }, | und ( ) verwenden, um optionalen, wiederholten und alternativen Text zu finden, und nur die passenden Teile ausgeben.
- Dateien mit grep und seinen wichtigsten Optionen durchsuchen
- Dateien an beliebigen Stellen im Verzeichnisbaum mit find und locate finden und Befehle auf die gefundenen Dateien anwenden.
- Den Verzeichnisbaum mit find durchsuchenMit find nach Name, Typ, Größe und Zeit suchen, Prüfungen kombinieren und Probleme mit Quoting und Zugriffsrechten vermeiden, auf die Anfänger stoßen.
- Gefundene Dateien bearbeiten und schnellere Suchverfahren nutzenBefehle auf jede von find gefundene Datei anwenden, Treffer sicher löschen und wissen, wann locate oder which das schnellere Werkzeug ist.
- Den Verzeichnisbaum mit find durchsuchen
- Textdateien in den beiden Terminaleditoren öffnen, ändern, speichern und schließen, die auf den meisten Linux-Systemen zu finden sind: dem einfachen nano und dem modalen vi.
- Eine Datei in nano bearbeiten und speichernEine Datei in nano öffnen, Text eingeben und ändern, suchen und ersetzen, Zeilen ausschneiden und einfügen sowie korrekt speichern und beenden.
- In den verschiedenen Modi von vi arbeitenZwischen Normalmodus, Einfügemodus und Befehlszeilenmodus von vi wechseln, sich mit Einzeltastenbefehlen bewegen und Text bearbeiten sowie speichern oder beenden, ohne Arbeit zu verlieren.
- Eine Datei in nano bearbeiten und speichern
Linux-Pipes und Textverarbeitung einfach erklärt
1Dateien im Terminal ansehen
Eine Textdatei kann einige Notizen oder Tausende von Einstellungen enthalten. Wähle eine Ansicht, die zu deinem Bedarf passt: die ganze Datei, eine Bildschirmseite, durch die du dich bewegen kannst, oder einen kleinen Teil an einem der beiden Enden. Du lernst, dich ohne Bearbeitung zu bewegen und zu suchen, einen genauen Zeilenbereich auszuwählen und zu beobachten, wie Text in einer wachsenden Datei hinzukommt. Diese Anzeigebefehle nehmen auch die Ausgabe anderer Befehle entgegen, sodass du mit denselben Kenntnissen eine lange Verzeichnisauflistung oder die Ergebnisse einer Pipeline untersuchen kannst.
1.1 Dateien mit cat und less anzeigen und seitenweise durchsehen
Kurze Dateien lassen sich leicht ausgeben. Lange Dateien sind leichter zu lesen, wenn die Anzeige auf dich wartet. Weder cat noch die normale Leseansicht in less bearbeitet die Datei.
Text mit cat ausgeben oder zusammenfügen
cat notes.txt sendet die gesamte Datei an die Standardausgabe, normalerweise dein Terminal. Der Name kommt von concatenate (verketten): Bei mehreren Dateinamen gibt der Befehl deren Inhalte in der angegebenen Reihenfolge aus. Er fügt keine Überschrift zwischen den Dateien ein.
Angenommen, a.txt enthält die Zeilen „a“ und „b“ und b.txt enthält „c d“. Führe aus:
cat -n a.txt b.txt
Du siehst drei nummerierte Zeilen. Die Nummerierung läuft über beide Dateien hinweg weiter; -n nummeriert die Ausgabe, nicht die gespeicherten Dateien. Um den zusammengefügten Text zu speichern, verwende cat a.txt b.txt > ab.txt. Die neue Datei enthält die drei ursprünglichen Zeilen ohne Nummerierung. Mit -n würden auch die Nummern gespeichert.
Die Ausgabe einer großen Datei kann ihren Anfang über den sichtbaren Bildschirmbereich hinausschieben. Mit einem Pager behältst du die Kontrolle über die Ansicht. less /etc/services öffnet eine lange Textdatei und zeigt eine Bildschirmseite. Das Programm kann die erste Bildschirmseite anzeigen, bevor es die gesamte Datei gelesen hat, was bei großen Dateien hilft.
In less bewegen
Die Eingabeaufforderung der Shell ist ausgeblendet, während less läuft. Das Programm wartet auf eine Navigationstaste:
| Taste | Aktion |
|---|---|
Leertaste oder f | Eine Bildschirmseite vorwärts |
b | Eine Bildschirmseite zurück |
Pfeil nach unten, Eingabetaste oder j | Eine Zeile nach unten |
Pfeil nach oben oder k | Eine Zeile nach oben |
g / G | Zur ersten / letzten Zeile springen |
h / q | Hilfe anzeigen / beenden |
Großschreibung ist wichtig: g und G führen zu entgegengesetzten Enden. Drücke q, wenn du mit dem Lesen fertig bist; wartest du auf eine neue Eingabeaufforderung der Shell, ohne den Pager zu beenden, kann er hängen geblieben wirken.
In der Ansicht suchen
Gib / ein, dann ein Wort, und drücke die Eingabetaste, um vorwärts zu suchen. Zum Beispiel findet /ssh den nächsten passenden Text. Gib ?ssh ein und drücke die Eingabetaste, um rückwärts zu suchen. Danach wiederholt n die Suche in ihrer aktuellen Richtung, während N in die entgegengesetzte Richtung geht. Nach einer Rückwärtssuche setzt n die Suche rückwärts fort.
Die Suche verwendet einen regulären Ausdruck. /^# findet eine Zeile, die mit „#“ beginnt, weil ^ den Zeilenanfang markiert. Du kannst zunächst einfache Wörter verwenden und die Musterregeln separat lernen.
less -N notes.txt ergänzt die Anzeige um Zeilennummern. Für breite Datensätze hält less -S notes.txt eine lange Zeile in einer Bildschirmzeile, indem das sichtbare rechte Ende abgeschnitten wird; mit den Pfeiltasten nach links und rechts bewegst du dich seitwärts. Der Text bleibt in der Datei erhalten. Ohne -S werden lange Zeilen auf zusätzliche Bildschirmzeilen umgebrochen. more ist ein älterer Pager mit weniger Navigationsmöglichkeiten.
Ausgabe eines anderen Befehls seitenweise ansehen
ls -l /usr/bin | less lässt dich die lange Auflistung durchsehen. Die Pipe liefert die Auflistung an den Pager. Für eine vorhandene Datei öffnet less notes.txt sie direkt; cat notes.txt | less fügt für dieselbe Ansicht einen zusätzlichen Befehl hinzu.
Verwende diese Befehle für Text. Die Ausgabe eines Binärprogramms wie /bin/ls kann Steuerzeichen anzeigen und das Terminal unlesbar machen. Gib in diesem Fall reset ein und drücke die Eingabetaste, um die Anzeige wiederherzustellen.
Wichtige Erkenntnisse
catgibt Dateien in der angegebenen Reihenfolge aus;-nnummeriert die zusammengefügte Ausgabe.lesszeigt Text seitenweise an, ohne ihn zu bearbeiten;qkehrt zur Shell zurück.- In
lesssucht/vorwärts,?rückwärts undnwiederholt die Suche in der aktuellen Richtung. less -Nzeigt Zeilennummern; mitless -Skannst du breite Zeilen seitwärts durchsehen.
1.2 Die ersten oder letzten Zeilen mit head und tail anzeigen
Wenn du nur die ersten oder neuesten Einträge einer Datei brauchst, verdeckt die Ausgabe des gesamten Inhalts den nützlichen Teil. head wählt den Anfang und tail das Ende. Beide geben standardmäßig 10 Zeilen aus.
Eine Anzahl von Zeilen auswählen
Enthält numbers.txt die Zahlen 1 bis 100, eine Zahl pro Zeile, gibt head numbers.txt 1 bis 10 aus, während tail numbers.txt 91 bis 100 ausgibt. Ändere die Anzahl mit -n:
head -n 3 numbers.txt
tail -n 3 numbers.txt
Der erste Befehl gibt 1, 2, 3 aus. Der zweite gibt 98, 99, 100 aus. Hat eine Datei weniger als die angeforderte Anzahl von Zeilen, gibt der Befehl aus, was vorhanden ist.
head -c 5 wählt fünf Bytes statt fünf Zeilen aus. Bei Text, der mit „banana“ beginnt, gibt es „banan“ aus. Bytes sind Speichereinheiten; bei UTF-8-Text kann ein Zeichen mehr als ein Byte benötigen, daher entspricht eine Byteanzahl nicht immer einer Zeichenanzahl.
Eine Startposition richtig lesen
Ein Pluszeichen ändert die Bedeutung von tail -n. Vergleiche:
| Befehl | Bedeutung |
|---|---|
tail -n 2 file | Die letzten zwei Zeilen ausgeben |
tail -n +2 file | Ab Zeile 2 bis zum Ende ausgeben |
tail -n +2 scores.csv lässt die erste Zeile weg. Das ist nützlich, wenn sie Spaltenüberschriften enthält. Der Befehl wählt nicht nur die zweite Zeile aus. Für die Datei mit den Zahlen gibt tail -n +98 numbers.txt 98 bis 100 aus.
GNU head akzeptiert auch eine negative Anzahl: head -n -97 numbers.txt lässt die letzten 97 Zeilen weg, sodass 1 bis 3 übrig bleiben. Das Vorzeichen gehört zur Anzahl und ist Teil der Anweisung.
Einen Bereich aus der Mitte auswählen
Um die Zeilen 11 bis 20 anzuzeigen, behalte zuerst alles bis einschließlich Zeile 20. Behalte dann die letzten 10 Zeilen dieser Auswahl:
head -n 20 numbers.txt | tail -n 10
Nach head umfassen die Daten 1 bis 20. Die letzten zehn Zeilen sind 11 bis 20. Ein Bereich einschließlich beider Enden enthält so viele Zeilen wie die Endnummer minus die Anfangsnummer plus eins; die zusätzliche Eins berücksichtigt, dass beide Enden eingeschlossen sind. Mit tail -n 11 wäre auch Zeile 10 enthalten.
Beide Befehle können aus einer Pipe lesen, wenn keine Eingabedatei angegeben wird. ls /etc | head -n 5 begrenzt eine Auflistung auf ihre ersten fünf Namen. Denke bei ls -lt | head -n 4 daran, dass die erste Ausgabezeile die Zeile „total“ ist: Nur drei Einträge folgen darauf.
Eine wachsende Datei beobachten
tail -f /var/log/app.log zeigt zuerst die letzten Zeilen an, wartet dann und gibt Text aus, der an die Datei angehängt wird. Verwende den Befehl, während ein Programm neue Einträge schreibt. Drücke Strg+C, um das Verfolgen zu beenden und zur Shell zurückzukehren. Die wartende Ansicht ist beabsichtigt; sie unterscheidet sich von der abgeschlossenen einmaligen Ausgabe des einfachen tail.
tail -F versucht es auch erneut und verfolgt den Dateinamen weiter, wenn eine Protokolldatei bei der Rotation entfernt und neu erstellt wird. Bei mehreren Eingabedateien kennzeichnen head und tail die Ausgabe jeder Datei mit einer Kopfzeile wie „==> fruit.txt <==“. Ergänze -q, wenn du den ausgewählten Text ohne diese Kopfzeilen benötigst.
Wichtige Erkenntnisse
headundtailgeben standardmäßig 10 Zeilen aus;-nlegt die Zeilenanzahl fest.tail -n +Kbeginnt bei Zeile K; es bedeutet nicht die letzten K Zeilen.- Für einen Bereich einschließlich beider Enden behältst du zuerst so viele Zeilen wie die Nummer der Endzeile und danach so viele letzte Zeilen wie die Länge des Bereichs.
tail -fverfolgt angehängten Text; Strg+C beendet das Verfolgen.tail -Fverfolgt einen Dateinamen auch beim Ersetzen der Datei, und-qunterdrückt Kopfzeilen bei mehreren Dateien.
2Ein- und Ausgabeströme sowie Fehlermeldungen gezielt umleiten
Ein Befehl kann während desselben Durchlaufs nützliche Ergebnisse und Fehlermeldungen erzeugen. Linux stellt dafür getrennte Wege und zusätzlich einen Weg für die Eingabe bereit. Die Shell kann jeden Weg mit einer Datei verbinden, bevor der Befehl startet. Wenn du diese Verbindungen verstehst, kannst du einen Bericht speichern, Fehler in einer separaten Datei aufbewahren und Daten bereitstellen, ohne sie einzutippen. Die Reihenfolge der Umleitungen ist wichtig, und eine Ausgabedatei kann geleert werden, bevor das Programm eine Eingabe liest.
2.1 Standardeingabe, Standardausgabe und Standardfehlerausgabe verstehen
Ein Befehl kommuniziert über Standardströme. Wenn du Eingabe und Ausgabe als getrennte Wege betrachtest, verstehst du, wie dasselbe Programm von einer Tastatur oder aus einer Datei lesen oder die Ausgabe eines anderen Befehls empfangen kann.
Die drei Datenströme erkennen
Ein Dateideskriptor ist die Nummer, mit der ein offener Datenstrom bezeichnet wird. Ein normaler Shellbefehl erbt diese drei:
| Nummer | Name | Übliche Verbindung im Terminal |
|---|---|---|
| 0 | Standardeingabe, stdin | Tastatureingabe |
| 1 | Standardausgabe, stdout | Normale Ergebnisse auf dem Bildschirm |
| 2 | Standardfehlerausgabe, stderr | Fehler und Statusmeldungen auf dem Bildschirm |
Obwohl stdout und stderr normalerweise denselben Bildschirm nutzen, sind es getrennte Verbindungen. Ein Programm kann während desselben Durchlaufs ein Ergebnis über stdout ausgeben und ein Problem über stderr erklären.
Zum Beispiel listet ls /etc/hostname /nonexistent > out.txt einen vorhandenen Pfad auf und trifft auf einen fehlenden Pfad. Die Auflistung geht nach out.txt. Die Meldung „No such file or directory“ bleibt im Terminal sichtbar, weil > stdout umleitet, nicht stderr. Ein Fehler auf dem Bildschirm bedeutet nicht, dass die Ausgabeumleitung fehlgeschlagen ist.
Einem Befehl Eingaben aus einer Datei geben
Befehle wie cat, sort, wc, grep, head und tail können stdin lesen, wenn keine Eingabedatei angegeben ist. Führe sort allein aus, gib einige Zeilen ein und drücke Strg+D am Anfang einer leeren Zeile. Das signalisiert das Ende der Eingabe, sodass sort die sortierten Zeilen ausgibt. Strg+C stoppt den Befehl, statt die Eingabe abzuschließen.
Der Eingabeoperator < verbindet eine Datei mit stdin:
wc -l < fruit.txt
Hat fruit.txt sechs Zeilen, die jeweils mit einem Zeilenvorschub enden, lautet die Ausgabe „6“. Vergleiche wc -l fruit.txt, das „6 fruit.txt“ ausgibt. Bei der umgeleiteten Form öffnet die Shell die Datei und wc erhält einen Datenstrom ohne den ursprünglichen Dateinamen. Bei der Form mit Argument öffnet wc die benannte Datei selbst.
Die Shell bereitet Umleitungen vor, bevor sie das Programm startet. sort < fruit.txt und < fruit.txt sort verbinden daher dieselbe Datei mit demselben Eingabestrom. Die übliche Platzierung nach dem Befehl ist leichter zu lesen.
Einige Zeilen direkt bereitstellen
Ein Here-Dokument platziert die Eingabe unter dem Befehl. Das Wort nach << markiert, wo diese Eingabe endet:
cat <<EOF > greeting.txt
Hello
See you soon
EOF
cat erhält die beiden Begrüßungszeilen über stdin und schreibt sie in die Ausgabedatei. Die letzte Zeile enthält nur EOF; es ist ein Trennzeichen und kein Teil des gespeicherten Textes. Ein anderes Wort als Trennzeichen ist möglich, wenn die abschließende Zeile genau damit übereinstimmt.
In Bash stellt ein Here-String eine Zeichenkette und einen Zeilenvorschub bereit. wc -w <<< "a b c" meldet drei Wörter. Diese beiden Formen liefern Eingaben direkt, ohne zuerst eine Eingabedatei anzulegen.
Vor dem Ausführen die Pfeilrichtung lesen
sort < fruit.txt liest die Datei. sort > fruit.txt öffnet sie als Ausgabeziel, leert den vorhandenen Inhalt und wartet auf Eingaben von der Tastatur. Die Shell führt dieses destruktive Öffnen aus, bevor sort läuft. Halte Eingabedateien und Ausgabeziele getrennt, sofern der Befehl keine dokumentierte Möglichkeit bietet, seine Eingabe sicher zu aktualisieren.
Wichtige Erkenntnisse
- stdin, stdout und stderr verwenden die Dateideskriptoren 0, 1 und 2.
<stellt eine Datei über stdin bereit;>ändert das Ziel von stdout.- Strg+D in einer leeren Eingabezeile signalisiert das Eingabeende; Strg+C stoppt den Befehl.
- Ein Here-Dokument verwendet ein passendes Trennzeichen allein in einer Zeile.
2.2 Ausgaben und Fehlermeldungen in Dateien umleiten
Eine Umleitung ändert das Ziel eines Datenstroms. Sie ist eine Operation der Shell, daher funktionieren dieselben Operatoren mit vielen verschiedenen Programmen. Entscheide zuerst, welchen Datenstrom du senden willst und ob eine vorhandene Datei ersetzt oder erweitert werden soll.
Normale Ergebnisse speichern oder anhängen
echo one > log.txt erstellt die Datei oder leert sie, bevor die Zeile „one“ geschrieben wird. Ein späteres echo two >> log.txt hängt „two“ an, sodass zwei Zeilen enthalten sind. >> erstellt auch eine fehlende Datei.
| Operator | Wirkung |
|---|---|
> out.txt | stdout schreiben, vorhandenen Inhalt ersetzen |
>> out.txt | stdout anhängen |
2> err.txt | stderr schreiben, vorhandenen Inhalt ersetzen |
2>> err.txt | stderr anhängen |
ls /etc/hostname /nonexistent > out.txt 2> err.txt trennt die erfolgreiche Auflistung vom Fehler wegen des fehlenden Pfads. Der Deskriptor muss direkt am Operator stehen. ls 2> err.txt leitet Fehler um; ls 2 > err.txt fordert ls auf, eine Datei namens „2“ aufzulisten, und leitet dessen normale Ausgabe um.
Datenströme in der richtigen Reihenfolge zusammenführen
2>&1 richtet stderr auf das aktuelle Ziel von stdout. Lies Umleitungen von links nach rechts:
ls /etc/hostname /nonexistent > all.txt 2>&1
Zuerst wird stdout nach all.txt umgeleitet. Dann kopiert stderr diese Verbindung. Beide Datenströme erreichen nun die Datei. &> all.txt ist eine kürzere Form in Bash und &>> all.txt hängt beide Datenströme an.
Wird die Reihenfolge umgekehrt, ändert sich das Ergebnis:
ls /etc/hostname /nonexistent 2>&1 > out.txt
Zuerst zeigt stderr dorthin, wohin stdout gerade zeigt: auf das Terminal. Dann wird stdout in die Datei umgeleitet. Stderr behält die frühere Verbindung, sodass der Fehler sichtbar bleibt. 2>&1 stellt in diesem Moment eine Verbindung her; es sorgt nicht dafür, dass stderr jeder späteren Änderung von stdout folgt.
Einen Datenstrom bewusst verwerfen
/dev/null verwirft Daten, die dorthin geschrieben werden. find / -name passwd 2>/dev/null lässt passende Pfade auf stdout stehen und blendet Diagnosemeldungen wie „Permission denied“ aus. Diese Meldungen können auf nicht durchsuchte Verzeichnisse hinweisen; wenn du sie verwirfst, gehen also auch Informationen über Lücken in der Suche verloren.
Eine Eingabedatei schützen
Schreibe nicht sort fruit.txt > fruit.txt. Die Shell leert das Ziel, bevor sort es liest. Verwende einen anderen Ausgabepfad, prüfe das Ergebnis und benenne es dann um. Speziell für sort nutzt sort -o fruit.txt fruit.txt die dafür vorgesehene Option für Ausgabedateien, um diese Datei sicher zu aktualisieren.
Bash kann auch versehentliches Überschreiben verhindern:
set -o noclobber
Mit dieser Einstellung schlägt gewöhnliches > für eine vorhandene reguläre Datei fehl. >> hängt weiterhin an. Verwende >| für ein absichtliches Überschreiben oder set +o noclobber, um die Einstellung auszuschalten. Der Schutz ist beim wiederholten Speichern von Berichten nützlich, ändert aber nicht die eigenen Optionen eines Befehls zum Schreiben von Dateien.
Wichtige Erkenntnisse
>überschreibt, während>>anhängt; verwende Deskriptor 2 für stderr.> all.txt 2>&1fängt beide Datenströme auf, weil Umleitungen von links nach rechts ausgeführt werden.2>&1 > out.txtbelässt stderr am früheren Ziel von stdout./dev/nullverwirft den ausgewählten Datenstrom einschließlich nützlicher Diagnosemeldungen.- Vermeide Umleitungen auf eine Eingabedatei;
sort -obietet eine unterstützte Alternative. - noclobber in Bash verhindert gewöhnliches
>bei vorhandenen regulären Dateien;>|setzt den Schutz außer Kraft.
3Befehle zu Pipelines verbinden
Kleine Textbefehle werden nützlicher, wenn ihre Ein- und Ausgaben zusammenpassen. Eine Pipeline kann eine Kopfzeile entfernen, eine Spalte auswählen, wiederholte Werte gruppieren und sie zählen, ohne nach jedem Schritt eine Datei anzulegen. Jede Stufe verändert, was die nächste erhält. Gehe die Stufen einzeln durch, damit du erkennst, ob eine falsche Gesamtzahl von der Auswahl, der Reihenfolge oder der Zählung stammt, und speichere Zwischenergebnisse, wenn du sie untersuchen möchtest.
3.1 Befehle mit Pipes und tee verbinden
Eine Pipe, geschrieben als |, verbindet die normale Ausgabe eines Befehls mit der Eingabe des nächsten. Du kannst mehrere kleine Aufgaben verbinden, ohne dazwischen eine temporäre Datei zu speichern.
Den Textfluss verfolgen
In ls /etc | wc -l gibt ls Namen aus und wc -l zählt die empfangenen Zeilenvorschubzeichen. Ein Befehl, der stdin liest, Text auswählt oder verändert und nach stdout schreibt, heißt Filter. sort, uniq, wc, cut, grep, head und tail können alle als Filter dienen.
Die allgemeine Form lautet command1 | command2 | command3. Jede Stufe erhält die Ausgabe der vorherigen Stufe, die eine andere Form als die ursprüngliche Datei haben kann. Eine spätere Stufe kann Zeilen oder Spalten nicht zurückholen, die eine frühere Stufe entfernt hat.
Eine Zählung schrittweise aufbauen
Angenommen, fruit.txt enthält sechs Zeilen: „banana“, „apple“, „cherry“, „apple“, „banana“, „apple“. Um die verschiedenen Namen zu zählen, führe zuerst aus:
sort fruit.txt
Die Ausgabe enthält drei Zeilen „apple“, zwei Zeilen „banana“ und eine Zeile „cherry“. Gleiche Namen stehen nun nebeneinander. Füge eine Stufe hinzu:
sort fruit.txt | uniq
uniq entfernt benachbarte Wiederholungen, sodass „apple“, „banana“ und „cherry“ bleiben. Schließlich meldet sort fruit.txt | uniq | wc -l 3. Würdest du die ursprüngliche Datei direkt zählen, erhieltest du sechs Zeilen, was eine andere Frage beantwortet.
Führe die wachsende Pipeline jeweils aus und prüfe ihr Ergebnis, bevor du den nächsten Befehl hinzufügst. Bei sehr langer Ausgabe kannst du vorübergehend | head ergänzen, um die ersten zehn Zeilen zu sehen. So erkennst du leichter eine nicht entfernte Kopfzeile oder ein falsch ausgewähltes Feld.
Fehler getrennt halten
Eine gewöhnliche Pipe transportiert stdout, nicht stderr. Bei einem vorhandenen und einem fehlenden Pfad zählt ls /etc/hostname /nonexistent | wc -l die eine normale Zeile der Auflistung. Der Fehler erscheint weiterhin im Terminal.
Um Diagnosemeldungen in die Daten einzubeziehen, verwende ls /etc/hostname /nonexistent 2>&1 | wc -l, das in diesem Beispiel zwei Zeilen zählt. |& in Bash führt stdout und stderr ebenfalls in der Pipe zusammen. Ob es sinnvoll ist, Fehler einzubeziehen, hängt davon ab, was die endgültige Anzahl aussagen soll.
Die Stufen laufen gleichzeitig. tail -f /var/log/app.log | grep ERROR zeigt neu angehängte passende Zeilen im Terminal an. Dies ist eine laufende Ansicht, kein Prozess, der auf das Ende der Datei wartet. Programme können die Ausgabe jedoch puffern; eine sofortige Anzeige ist nicht für jede mögliche Pipeline garantiert.
Unterwegs eine Kopie speichern
tee schreibt seine Eingabe sowohl in eine Datei als auch nach stdout:
sort fruit.txt | uniq | tee unique.txt | wc -l
Das Terminal zeigt 3, während unique.txt die drei Namen speichert. tee -a hängt an, statt die gespeicherte Datei zu ersetzen. Ein früher platziertes tee würde eine frühere Form der Daten speichern.
Eine Pipe verbindet mit einem Befehl, während > eine Datei bezeichnet. ls > less erstellt eine Datei namens „less“; es startet nicht den Pager. Der empfangende Befehl muss außerdem stdin lesen: Text durch eine Pipe an echo oder ls zu senden, macht ihn nicht zu deren Argumenten.
Wichtige Erkenntnisse
|verbindet stdout mit stdin des nächsten Befehls.- Prüfe eine Pipeline Stufe für Stufe; jede Stufe erhält die Ausgabe der vorherigen.
- stderr bleibt außerhalb einer gewöhnlichen Pipe, sofern du die Datenströme nicht zusammenführst.
teespeichert die Eingabe und gibt sie weiter;tee -ahängt an.- Text aus einer Pipe ist stdin und keine Liste von Befehlsargumenten.
3.2 Zeilen zählen, sortieren und doppelte Zeilen entfernen
Zählen und Ordnen sind getrennte Aufgaben. Entscheide vor dem Zählen, ob du Datensätze, Wörter, Bytes oder unterschiedliche Werte benötigst. Entscheide vor dem Entfernen von Duplikaten, ob gleiche Zeilen bereits nebeneinander stehen.
Mit wc das Richtige zählen
Das einfache wc file meldet Zeilen, Wörter und Bytes in dieser Reihenfolge und danach den Dateinamen. Die Obstliste mit sechs Zeilen „banana“, „apple“, „cherry“, „apple“, „banana“, „apple“ ergibt „6 6 39 fruit.txt“. Jede Zeile trägt ihre Buchstaben und ein Zeilenvorschubbyte bei.
| Option | Was sie zählt |
|---|---|
-l | Zeilenvorschubzeichen |
-w | Durch Leerraum getrennte Wörter |
-c | Bytes |
-m | Zeichen |
Ein letzter Textabschnitt ohne Zeilenvorschub wird von wc -l nicht gezählt. Text mit „one“, einem Zeilenvorschub und danach „two“ ergibt daher die Anzahl 1. In UTF-8 benötigt „café“ gefolgt von einem Zeilenvorschub sechs Bytes, aber fünf Zeichen, weil „é“ zwei Bytes benötigt. Bei mehreren Eingabedateien gibt wc deren Anzahlen und eine zusätzliche Gesamtsumme aus.
Text- oder numerische Sortierung wählen
sort gibt sortierte Zeilen aus, ohne die Eingabedatei zu ändern. Seine Standardreihenfolge richtet sich nach der aktuellen Spracheinstellung. sort -f vergleicht, ohne zwischen Groß- und Kleinschreibung zu unterscheiden.
Die Textsortierung vergleicht Zeichen: „100“, „25“, „9“ erscheinen in dieser Reihenfolge, weil ihre ersten Ziffern „1“, „2“, „9“ sind. sort -n vergleicht Zahlenwerte und ergibt 9, 25, 100. Ergänze -r für die umgekehrte Reihenfolge, wie in sort -rn. sort -h versteht Größensuffixe wie „2K“, „300M“ und „1G“.
Nach einem Feld sortieren
Für durch Kommas getrennte Datensätze legt -t, das Trennzeichen fest. -k3,3nr wählt nur Feld 3 aus, vergleicht numerisch und kehrt die Reihenfolge um:
tail -n +2 scores.csv | sort -t, -k3,3nr | head -n 3
Bei „name,city,score“, gefolgt von „Ana,Lisbon,82“, „Ben,Oslo,75“, „Chen,Lisbon,91“, „Dara,Oslo,68“ und „Eli,Lisbon,88“, lautet das Ergebnis Chen, Eli und dann Ana mit ihren vollständigen Datensätzen. Die erste Stufe entfernt die Kopfzeile. Andernfalls zählt deren nicht numerischer Punktzahlschlüssel bei numerischer Sortierung als null.
Ohne -t trennen Leerzeichen oder Tabulatoren die Felder. -k2 reicht vom Feld 2 bis zum Zeilenende; -k2,2 begrenzt den Schlüssel auf Feld 2.
Duplikate vor dem Zählen gruppieren
uniq vergleicht jede Zeile mit der benachbarten Folge gleicher Zeilen. In der unsortierten Obstliste bleiben alle sechs Zeilen erhalten, weil keine gleichen Namen nebeneinander stehen. sort fruit.txt | uniq gibt die drei verschiedenen Namen aus; auch sort -u fruit.txt kann eine sortierte Liste ohne Duplikate erzeugen.
Nach dem Sortieren meldet uniq -c die Anzahl jeder Folge: „3 apple“, „2 banana“, „1 cherry“, wobei Leerzeichen die Anzahlen auffüllen. uniq -d gibt jeden wiederholten Wert einmal aus und uniq -u nur Werte, die einmal vorkommen. uniq -i ignoriert beim Vergleich Groß- und Kleinschreibung.
Für die häufigsten Werte zuerst verwende sort fruit.txt | uniq -c | sort -rn. Die erste Sortierung gruppiert identische Zeilen; die letzte ordnet ihre Anzahlen. Ohne die erste Sortierung werden verstreute Folgen getrennt gezählt.
Wichtige Erkenntnisse
wc -lzählt Zeilenvorschübe,-wWörter,-cBytes und-mZeichen.sort -nvergleicht Zahlen;-rkehrt die Reihenfolge um;-hverarbeitet Größensuffixe.sort -t, -k3,3nrsortiert durch Kommas getrennte Datensätze nach Feld 3 numerisch absteigend.- Entferne eine Kopfzeile, bevor du Datensätze sortierst.
uniqentfernt benachbarte Wiederholungen; sortiere zuerst, wenn gleiche Werte verstreut sind.uniq -czählt Folgen,-dwählt wiederholte Werte und-ueinmal vorkommende Werte aus.sort | uniq -c | sort -rngruppiert Werte, zählt sie und ordnet die Anzahlen.
3.3 Spalten mit cut extrahieren
Ein Datensatz enthält oft mehr Informationen, als für eine Frage nötig sind. cut wählt Felder oder feste Positionen aus jeder Zeile aus und schreibt die Auswahl nach stdout. Es ordnet die ursprüngliche Datei nicht um und bearbeitet sie nicht.
Felder anhand ihres Trennzeichens auswählen
Ein Trennzeichen trennt Felder. In /etc/passwd trennen Doppelpunkte den Benutzernamen, Passwortplatzhalter, die Benutzer-ID, Gruppen-ID, den vollständigen Namen, das Home-Verzeichnis und die Login-Shell. Für diesen Beispieldatensatz:
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
cut -d: -f1,6 gibt „alice:/home/alice“ aus. Feldnummern beginnen bei 1, und das Trennzeichen bleibt zwischen ausgewählten Feldern erhalten. cut -d: -f5 gibt „Alice Smith“ aus; das Leerzeichen innerhalb des Namens ist Teil dieses Feldes, weil das Trennzeichen ein Doppelpunkt ist.
| Auswahl | Ausgegebene Felder |
|---|---|
-f1,3 | Felder 1 und 3 |
-f2-4 | Felder 2 bis 4 |
-f3- | Feld 3 bis zum letzten Feld |
Die Liste wählt Felder aus und legt keine neue Reihenfolge fest. cut -d, -f3,1 gibt weiterhin Feld 1 gefolgt von Feld 3 aus. Standardmäßig ist das Trennzeichen ein Tabulator, sodass cut -f2 file das zweite durch Tabulatoren getrennte Feld auswählt.
Eine Zeile ohne Trennzeichen wird vollständig ausgegeben. Zum Beispiel gibt cut -f2 „no tabs here“ unverändert aus, weil die Zeile keinen Tabulator enthält. Ergänze -s, um Zeilen ohne Trennzeichen zu unterdrücken. Eine Zeile, die Trennzeichen enthält, in der aber ein angefordertes Feld fehlt, ist ein anderer Fall; -s ist keine allgemeine Prüfung auf vollständige Datensätze.
Feste Positionen auswählen
cut -c1-5 wählt die Positionen 1 bis 5 aus. Für den obigen Kontodatensatz gibt es „alice“ aus. Die Auswahl nach Position eignet sich für Text mit fester Feldbreite, bei dem die gewünschten Spalten in jeder Zeile an denselben Stellen beginnen. Die Feldauswahl eignet sich für Datensätze, deren Feldlängen variieren, deren Trennzeichen aber gleich bleiben.
Das Verhalten von Trennzeichen prüfen
Bei cut -d' ' -f2 ist jedes einzelne Leerzeichen ein Trennzeichen. Der Text „a b“ hat zwischen seinen zwei Leerzeichen ein leeres zweites Feld, daher ist das Ergebnis eine leere Zeile. Sind wiederholte Leerzeichen nur Abstandshalter zwischen Spalten, fasst tr -s ' ' | cut -d' ' -f2 zuerst jede Folge von Leerzeichen zu einem zusammen.
cut behandelt auch Kommas innerhalb von Werten in Anführungszeichen als Trennzeichen. Ein CSV-Wert wie „Smith, Ann“ in Anführungszeichen wird nicht automatisch zusammengehalten. Verwende einfache Beispiele mit Trennzeichen nur, wenn die Feldgrenzen tatsächlich zur Trennzeichenregel passen.
Werte aus einer ausgewählten Spalte zählen
Um Städte in scores.csv zu zählen, beginne mit cut -d, -f2 scores.csv. Für die Datensätze von Ana, Ben, Chen, Dara und Eli gibt dies „city“, „Lisbon“, „Oslo“, „Lisbon“, „Oslo“, „Lisbon“ aus. Dann:
cut -d, -f2 scores.csv | tail -n +2 | sort | uniq -c | sort -rn
Das Weglassen der ersten Zeile entfernt „city“. Das Sortieren gruppiert die drei Einträge für Lisbon und die zwei für Oslo; uniq -c zählt sie, und die letzte Sortierung stellt „3 Lisbon“ vor „2 Oslo“. Vergisst du die Stufe zum Entfernen der Kopfzeile, entsteht ein zusätzlicher Wert, „1 city“, weil eine Überschrift für diese Befehle ebenfalls Text ist.
Wichtige Erkenntnisse
cut -dlegt das Trennzeichen fest und-fwählt ab 1 nummerierte Felder aus.- Feldlisten wählen Felder in ihrer ursprünglichen Reihenfolge aus;
-cwählt feste Positionen. - Das Standardtrennzeichen ist ein Tabulator;
-slässt Zeilen ohne Trennzeichen weg. - Wiederholte Leerzeichen erzeugen leere Felder, und
cutverarbeitet keine CSV-Anführungszeichen. - Für Häufigkeitszählungen entferne die Kopfzeile, wähle den Wert aus, gruppiere gleiche Zeilen und zähle sie.
4Text mit grep und regulären Ausdrücken durchsuchen
Bei der Textsuche entscheidest du zuerst, was als Treffer zählt. Vielleicht brauchst du eine literale Wortfolge, ein ganzes Wort, eine vollständige Zeile oder ein Muster wie zwei Buchstaben gefolgt von vier Ziffern. grep kann passende Zeilen anzeigen oder ihre Nummern, Anzahlen und Dateinamen melden. Reguläre Ausdrücke beschreiben die Muster, während Anführungszeichen verhindern, dass die Shell sie vorher verändert. Du gehst von einfachen Treffern zu gruppierten Alternativen und wiederholten Teilen über.
4.1 Dateien mit grep und seinen wichtigsten Optionen durchsuchen
grep durchsucht Text und gibt normalerweise jede Zeile aus, die einen Treffer enthält. Für eine nützliche Suche wählst du sowohl das Muster als auch die benötigte Art des Ergebnisses: Zeilen, Anzahlen, Zeilennummern oder Dateinamen.
Mit einem Muster in Anführungszeichen beginnen
Die übliche Form ist grep 'pattern' file. Ohne Dateiargument liest grep stdin. Die Suche unterscheidet zwischen Groß- und Kleinschreibung, sofern du nicht -i hinzufügst.
Angenommen, server.log enthält fünf Einträge: eine INFO-Zeile zum Start, eine ERROR-Zeile über einen vollen Datenträger, eine WARN-Zeile über einen erneuten Versuch, eine Zeile mit dem kleingeschriebenen „error timeout“ und eine INFO-Zeile über eine Sicherung. grep 'ERROR' server.log gibt nur die Zeile mit dem großgeschriebenen ERROR aus. grep -i 'error' server.log gibt beide Fehlerzeilen aus.
Setze Muster auch dann in Anführungszeichen, wenn sie einfach aussehen. grep 'disk full' server.log sucht nach den beiden Wörtern zusammen. Ohne Anführungszeichen verwendet grep disk full server.log „disk“ als Muster und behandelt „full“ als weiteren Dateinamen. Anführungszeichen verhindern auch, dass die Shell Sterne und andere Sonderzeichen expandiert, bevor grep sie erhält.
Die benötigte Ausgabe wählen
| Option | Ergebnis |
|---|---|
-i | Treffer ohne Unterscheidung der Groß- und Kleinschreibung |
-v | Nicht passende Zeilen ausgeben |
-c | Anzahl der passenden Zeilen ausgeben |
-n | Treffern ihre Zeilennummern voranstellen |
-w | Einen Ganzworttreffer verlangen |
-x | Einen Treffer für die gesamte Zeile verlangen |
Optionen lassen sich kombinieren: grep -ic 'error' server.log meldet 2, während grep -n 'WARN' server.log Zeile 3 angibt. -c zählt passende Zeilen, nicht die Anzahl der Vorkommen darin. Eine Zeile mit „error error“ trägt eins zur Anzahl bei.
Betrachte die Zeilen „error“, „terror“, „errors“ und „Error found“. Das einfache grep 'error' findet die ersten drei. grep -w 'error' findet nur die erste, weil „error“ in „terror“ oder „errors“ kein ganzes Wort ist. Mit zusätzlichem -i passt auch „Error found“. -x verlangt eine vollständig passende Zeile, daher passt „Error found“ bei einer Suche nach der ganzen Zeile „error“ weiterhin nicht.
Mehrere Dateien durchsuchen
Wenn mehrere Dateien durchsucht werden, stellt grep Treffern normalerweise die Dateinamen voran. grep -r 'TODO' notes durchsucht Dateien im gesamten Verzeichnisbaum. Ergänze -l, um nur Namen von Dateien mit Treffern auszugeben: grep -rl 'TODO' notes. Das großgeschriebene -L listet Dateien ohne Treffer auf. Dies sind Ergebnisse einer Dateiauswahl, keine Anzahlen passender Zeilen.
Entscheiden, ob das Muster literal ist
Standardmäßig interpretiert grep einen regulären Ausdruck. Ein Punkt steht für ein beliebiges einzelnes Zeichen, sodass '10.0.0.7' auch auf „10a0b0c7“ passen kann. grep -F '10.0.0.7' file sucht nach dem genauen Text. Auch die Maskierung jedes Punktes wie in '10\.0\.0\.7' macht die Punkte literal.
grep -q unterdrückt die normale Ausgabe und meldet das Ergebnis über seinen Rückgabestatus: 0 für einen Treffer, 1 für keinen Treffer und bei GNU grep normalerweise 2 für einen Fehler. Eine fehlende Eingabedatei ist ein Fehler und kein Beleg dafür, dass das Muster nicht vorkam.
In einer Pipeline zählt grep -i 'error' server.log | wc -l passende Zeilen genau wie grep -ic. Die erste Form lässt Raum für weitere Filter zwischen der Auswahl der Zeilen und ihrer Zählung.
Wichtige Erkenntnisse
grepgibt passende Zeilen aus und unterscheidet zwischen Groß- und Kleinschreibung, sofern nicht-iverwendet wird.- Setze das Muster in Anführungszeichen, damit die Shell es unverändert übergibt.
-czählt passende Zeilen;-nnummeriert sie;-vwählt nicht passende Zeilen aus.-wverlangt ein ganzes Wort und-xeine ganze Zeile.-rdurchsucht einen Verzeichnisbaum,-llistet Dateien mit Treffern auf und-LDateien ohne Treffer.-Fbehandelt ein Muster als festen Text;-qmeldet das Suchergebnis über den Rückgabestatus.
4.2 Einfache reguläre Ausdrücke schreiben
Ein regulärer Ausdruck oder Regex beschreibt Text, auf den das Muster passen kann. grep sucht normalerweise an beliebiger Stelle in einer Zeile nach einem passenden Teil und gibt dann die ganze Zeile aus. Die meisten Buchstaben stehen für sich selbst; Sonderzeichen beschreiben Positionen, Auswahlmöglichkeiten oder Wiederholungen.
Ein Zeichen oder eine Position finden
Der Punkt . steht für ein Zeichen innerhalb einer Zeile. Bei den Zeilen „cat“, „cart“, „coat“, „cut“, „act“, „scat“ und „color“ passt das Muster 'c.t' auf „cat“, „cut“ und „scat“. Die letzte Zeile enthält „cat“ als passenden Teil. „coat“ hat zwei Zeichen zwischen „c“ und „t“, sodass ein Punkt sie nicht abdecken kann.
Verwende Anker, um Positionen einzuschränken. ^ markiert den Anfang einer Zeile und $ das Ende:
| Muster | Was es verlangt |
|---|---|
^c | Eine Zeile, die mit „c“ beginnt |
t$ | Eine Zeile, die mit „t“ endet |
^c.t$ | Genau „c“, ein Zeichen, dann „t“ |
^$ | Eine leere Zeile |
grep '^c.t$' words.txt gibt nur „cat“ und „cut“ aus. Die Verankerung an beiden Enden schließt eine längere Zeile wie „scat“ aus.
Ein Zeichen aus einer Menge wählen
Ein Klammerausdruck steht für ein Zeichen. [ao] bedeutet entweder „a“ oder „o“, sodass 'c[ao]t' auf den Teil „cat“ in „cat“ und „scat“ passt. [0-9] beschreibt eine Ziffer. Ein Zirkumflex direkt nach der öffnenden Klammer negiert die Menge: 'c[^a]t' passt auf „cut“, aber nicht auf „cat“. Dieser Zirkumflex schließt ein Zeichen aus; er markiert an dieser Stelle keinen Zeilenanfang.
Benannte Klassen beschreiben Kategorien in der aktuellen Spracheinstellung. [[:digit:]] wählt eine Ziffer, [[:alpha:]] einen Buchstaben, [[:alnum:]] einen Buchstaben oder eine Ziffer und [[:upper:]] oder [[:lower:]] einen Groß- beziehungsweise Kleinbuchstaben. [[:space:]] umfasst Leerzeichen, Tabulatoren und andere Leerraumzeichen. Behalte beide Paare eckiger Klammern bei: Der Klassenname steht innerhalb des äußeren Mengenausdrucks.
Das vorhergehende Element wiederholen
* bedeutet null oder mehr Vorkommen des direkt davorstehenden Elements. 'ca*t' kann auf „ct“, „cat“ oder „caat“ passen. Es passt auch auf „act“, weil diese Zeile „ct“ mit null Vorkommen von „a“ enthält. Um eine beliebige Zeichenfolge zu finden, kombiniere Punkt und Stern zu .*.
'^c.*t$' passt in der Wortliste auf „cat“, „cart“, „coat“ und „cut“. Für einen Platzhalter im Dateinamen und einen regulären Ausdruck gelten unterschiedliche Regeln für den Stern: Das Shellmuster *.txt beschreibt Namen, die auf „.txt“ enden, aber der reguläre Ausdruck für diese Endung ist '\.txt$'.
Ein Sonderzeichen literal machen
Ein umgekehrter Schrägstrich kann eine Sonderbedeutung aufheben. \. steht für einen tatsächlichen Punkt, \* für einen Stern und \[ für eine öffnende eckige Klammer. Auch [.] wählt einen literalen Punkt aus. grep '\.conf$' file wählt Zeilen aus, die auf „.conf“ enden.
Bei einer Suche in einer Konfigurationsdatei kannst du einfache Kommentare und leere Zeilen mit grep -v '^#' app.conf | grep -v '^$' entfernen. Die erste Prüfung erkennt Kommentare nur, wenn „#“ das erste Zeichen ist. Die standardmäßige einfache Syntax behandelt nicht maskierte ?, +, geschweifte Klammern, | und runde Klammern als gewöhnliche Zeichen. GNU grep unterstützt Operatorformen mit umgekehrtem Schrägstrich; grep -E stellt die erweiterte Syntax ohne diese Schrägstriche bereit.
Wichtige Erkenntnisse
- grep sucht nach einem passenden Teil, sofern Anker nicht die ganze Zeile verlangen.
.steht für ein Zeichen;^und$verankern Anfang und Ende.- Ein Klammerausdruck wählt ein Zeichen aus;
[^a]schließt „a“ aus. - Benannte Klassen wie
[[:digit:]]benötigen beide Paare eckiger Klammern. *wiederholt das vorhergehende Element nullmal oder häufiger;.*steht für eine Zeichenfolge.- Verwende
\.oder[.]für einen literalen Punkt.
4.3 Erweiterte reguläre Ausdrücke mit grep -E verwenden
Erweiterte reguläre Ausdrücke bieten zusätzliche Möglichkeiten, optionale Teile, wiederholte Gruppen und Alternativen auszudrücken. Verwende grep -E, damit das Muster in dieser Syntax gelesen wird. Punkt, Anker, Mengen und Stern behalten ihre bisherigen Bedeutungen.
Wiederholungen zählen
Ein Operator folgt auf das Element, das er verändert. Dieses Element kann ein einzelnes Zeichen, ein Klammerausdruck oder eine Gruppe sein:
| Operator | Anzahl der Vorkommen |
|---|---|
? | Null oder eins |
+ | Eins oder mehr |
{n} | Genau n |
{n,} | Mindestens n |
{n,m} | Von n bis m |
'logs?' passt auf „log“ und „logs“: Nur das „s“ ist optional. 'ca+t' verlangt mindestens ein „a“ und passt daher auf „cat“ und den passenden Teil in „scat“, aber nicht auf „ct“ innerhalb von „act“. Ohne -E wird ein nicht maskiertes Frage- oder Pluszeichen in der einfachen Syntax zu literalem Text.
Für einen vollständigen Code aus zwei Großbuchstaben und vier Ziffern verwende:
grep -E '^[A-Z]{2}[0-9]{4}$' codes.txt
„AB1234“ und „QZ0042“ passen. „A12345“ hat nur einen Buchstaben am Anfang, „ab1234“ verwendet Kleinbuchstaben und „XY98765“ hat eine zusätzliche Ziffer. Die beiden Anker verhindern, dass ein gültig aussehender Abschnitt innerhalb eines längeren Codes als Treffer zählt. Mit zusätzlichem -i wäre auch der kleingeschriebene Code erlaubt.
Alternativen gruppieren
| bedeutet eine Alternative innerhalb eines erweiterten Musters. 'cat|cut' sucht an beliebiger Stelle in einer Zeile nach einem der beiden Wörter. Runde Klammern legen die Grenzen einer Gruppe fest: 'c(a|o)t' wählt „a“ oder „o“ zwischen „c“ und „t“. Ein nachfolgender Quantifizierer gilt für die ganze Gruppe, sodass '(ab)+' auf ein oder mehrere Vorkommen von „ab“ passt.
Setze das Muster in Anführungszeichen. In grep -E cat|cut words.txt interpretiert die Shell den senkrechten Strich ohne Anführungszeichen als Pipe zwischen Befehlen. In grep -E 'cat|cut' words.txt übergibt sie dieses Zeichen als Teil eines einzigen Musters an grep.
Treffer statt vollständiger Zeilen ausgeben
-o gibt nur passende Teile aus, einen pro Ausgabezeile. Der folgende Befehl extrahiert aus einer längeren Zeile eine Form aus Zahlen mit Punkten dazwischen:
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' server.log
Der eingeklammerte Teil besteht aus einer bis drei Ziffern, gefolgt von einem literalen Punkt; {3} wiederholt ihn dreimal. Der letzte Teil ergänzt eine bis drei Ziffern. Das Muster extrahiert „10.0.0.7“ aus einer Zeile, die diese Zeichenfolge enthält, akzeptiert aber auch „999.999.999.999“. Die Übereinstimmung mit einer Form prüft nicht, ob jede Zahl im gültigen Bereich einer Adresse liegt.
Leere Zeilen und Kommentarzeilen gemeinsam entfernen
grep -Ev '^[[:space:]]*(#|$)' app.conf wählt aktive Einstellungen aus. Lies das Muster der Reihe nach: Beginne am Anfang, erlaube Leerraum und suche dann entweder nach „#“ oder dem Zeilenende. Es erkennt daher eingerückte Kommentare und Zeilen, die nur Leerraum enthalten, ebenso wie leere Zeilen. -v behält die Zeilen, auf die diese Beschreibung nicht passt, wie „port=8080“. Der ältere Befehlsname egrep gilt in GNU grep als veraltet; verwende grep -E.
Wichtige Erkenntnisse
grep -Eaktiviert nicht maskierte?,+, geschweifte Klammern,|und runde Klammern als Operatoren.- Quantifizierer gelten für das vorhergehende Zeichen, die vorhergehende Menge oder Gruppe.
- Verwende Anker um ein Muster, wenn der gesamte Datensatz dazu passen muss.
|stellt Alternativen bereit und runde Klammern gruppieren sie; setze das Muster in Anführungszeichen.-ogibt jeden passenden Teil aus, nicht die ganze Zeile.- Ein regulärer Ausdruck, der eine Form prüft, kann trotzdem Werte akzeptieren, die im tatsächlichen System ungültig sind.
5Dateien nach Name, Typ, Größe und Alter suchen
Eine Dateisuche fragt, wo sich ein Eintrag befindet; eine Textsuche fragt, was darin steht. Beginne eine Dateisuche im richtigen Verzeichnis und grenze sie dann nach Name, Typ, Größe oder Alter ein. Du kannst die passenden Pfade an einen anderen Befehl übergeben, ohne Namen mit Leerzeichen zu zerlegen. Eine aktuelle Suche im Verzeichnisbaum und eine schnelle Datenbankabfrage haben unterschiedliche Stärken. Prüfe die Auswahl und verstehe, wann die Aktion ausgeführt wird, bevor du sie auf viele Treffer anwendest.
5.1 Den Verzeichnisbaum mit find durchsuchen
find durchläuft einen Verzeichnisbaum und prüft die Einträge, auf die es trifft. Wähle zuerst das Startverzeichnis: find project gibt project selbst und die Einträge darunter aus. Zusätzliche Prüfungen grenzen die Auswahl ein.
Namen, Pfade und Typen abgleichen
find project -name '*.txt' wählt Namen aus, die irgendwo unterhalb des Startverzeichnisses auf „.txt“ enden. Setze den Platzhalter in Anführungszeichen, damit die Shell ihn unverändert übergibt. -name unterscheidet zwischen Groß- und Kleinschreibung, daher benötigt „Guide.TXT“ für einen Treffer ohne diese Unterscheidung -iname '*.txt'.
Das Muster muss auf den gesamten Namen des Eintrags passen, ohne seine übergeordneten Verzeichnisse. -name 'guide' passt nicht auf „guide.txt“; -name 'guide*' passt. Verwende -path '*/src/*', wenn der Verzeichnisteil wichtig ist. find gibt die Reihenfolge der Traversierung aus, ergänze also | sort, wenn du sortierte Pfade möchtest.
-type f wählt reguläre Dateien aus, -type d Verzeichnisse und -type l symbolische Links. find project -type f -name '*.txt' verlangt, dass sowohl die Typ- als auch die Namensprüfung zutrifft. Ein Verzeichnis namens „notes.txt“ besteht die Typprüfung nicht, obwohl sein Name passt.
Größenvergleiche verstehen
-size vergleicht eine Größe, nachdem sie auf die gewählte Einheit aufgerundet wurde. c bedeutet Bytes, k Kibibyte zu 1.024 Byte, M Mebibyte zu 1.048.576 Byte und G Gibibyte. Ein vorangestelltes Plus bedeutet größer als, ein Minus kleiner als und kein Vorzeichen gleich der angegebenen Anzahl von Einheiten.
Bei -size +100M muss die aufgerundete Größe mehr als 100 MiB-Einheiten betragen. Eine Datei, die ein Byte größer als 100 MiB ist, wird auf 101 Einheiten aufgerundet und passt. Eine nicht leere Datei unter 1 MiB wird auf eine Einheit aufgerundet, daher findet -size -1M nur leere Dateien. Verwende für eine genaue Byteschwelle eine Prüfung in Bytes oder für einen brauchbaren Bereich kleiner Dateien eine kleinere Einheit.
Alter prüfen und Tiefe begrenzen
-mtime verwendet abgeschlossene Zeiträume von 24 Stunden seit der Änderung. -mtime -7 wählt Einträge aus, die vor weniger als sieben Tagen geändert wurden. -mtime +30 wählt ein Alter von mehr als 30 abgeschlossenen Zeiträumen aus: mindestens 31 Tage. -mmin -30 verwendet Minuten für kürzliche Änderungen. -user alice wählt einen Eigentümer und -empty leere Dateien oder Verzeichnisse aus.
Um das Startverzeichnis und seine unmittelbaren Einträge zu untersuchen, ohne in Unterverzeichnisse einzutreten, verwende find project -maxdepth 1 -type f. Setze -maxdepth vor die Prüfungen.
Prüfungen kombinieren und Muster erhalten
Nebeneinander geschriebene Prüfungen bedeuten UND. -o bedeutet ODER, wie in find project -name '*.txt' -o -name '*.md'. ! -name '*.c' negiert eine Namensprüfung. Mache dir bei einer einfachen Auswahl die Beziehung zwischen den Prüfungen klar, bevor du Aktionen hinzufügst.
Ein Platzhalter ohne Anführungszeichen wird von der Shell anhand deines aktuellen Verzeichnisses expandiert. Passt dort nur notes.txt, wird find . -name *.txt zu einer Suche nach diesem einen Namen und übergeht andere Textdateien. Bei mehreren lokalen Treffern kann der Befehl fehlschlagen, weil zusätzliche Namen im Prüfausdruck erscheinen.
Eine Suche in geschützten Verzeichnissen kann „Permission denied“ melden. 2>/dev/null blendet diese Fehler aus, macht aber unlesbare Verzeichnisse nicht durchsuchbar. find prüft den Verzeichnisbaum während der Ausführung; ein laufend genutztes Dateisystem kann sich dennoch ändern, bevor ein späterer Befehl die zurückgegebenen Pfade verwendet.
Wichtige Erkenntnisse
finddurchläuft einen Verzeichnisbaum ab einem Startpfad und gibt Einträge aus, die seine Prüfungen bestehen.- Setze Namensplatzhalter in Anführungszeichen;
-nameprüft den ganzen Namen und-pathden vollständigen Pfad. - Verwende
-type f,doderlfür reguläre Dateien, Verzeichnisse beziehungsweise symbolische Links. - Größenprüfungen runden vor dem Vergleich auf;
-size -1Mwählt nur leere Dateien aus. -mtime +30beginnt bei 31 abgeschlossenen Tagen, während-mminMinuten verwendet.- Nebeneinanderstehende Prüfungen bedeuten UND,
-obedeutet ODER und!negiert eine Prüfung.
5.2 Gefundene Dateien bearbeiten und schnellere Suchverfahren nutzen
Nach der Auswahl von Dateien kannst du ihre Pfade an einen anderen Befehl übergeben. Wenn Auswahl und Aktion im selben find-Ausdruck stehen, werden Leerzeichen innerhalb von Dateinamen nicht als Trennzeichen zwischen Namen behandelt.
Einen Befehl für jeden Treffer ausführen
Die Aktion -exec command {} \; führt den Befehl einmal pro passendem Eintrag aus. find ersetzt {} durch den Pfad dieses Eintrags. Zum Beispiel:
find project -name 'main.c' -exec wc -l {} \;
Ist der Treffer project/src/main.c, wird damit wc -l project/src/main.c ausgeführt. Das maskierte Semikolon beendet die Aktion. Der umgekehrte Schrägstrich verhindert, dass die Shell das Semikolon zuerst verwendet, um den gesamten Shellbefehl zu beenden.
Verwende {} +, um mehrere Pfade gesammelt an weniger Befehlsaufrufe zu übergeben:
find notes -type f -name '*.txt' -exec grep -l 'TODO' {} +
grep erhält die ausgewählten Dateipfade als Argumente und listet diejenigen auf, die „TODO“ enthalten. Beide Formen erhalten einen Pfad wie „notes/team plan.txt“ als ein Argument. Die Form mit + verringert den Aufwand für Programmstarts, wenn viele Dateien passen.
Dateiauswahl mit Textauswahl kombinieren
find prüft Dateieigenschaften; grep untersucht Inhalte. Ergänze -mtime -7 vor der Aktion, um nur kürzlich geänderte Textdateien zu durchsuchen:
find notes -type f -name '*.txt' -mtime -7 -exec grep -l 'TODO' {} +
Zuerst wählen die Prüfungen von Name, Typ und Alter Dateien aus. Dann durchsucht grep ihren Text. grep -r allein kann den Inhalt eines Verzeichnisbaums durchsuchen, ersetzt aber diese Prüfungen der Dateieigenschaften nicht.
Erst nach Prüfung der Auswahl löschen
-delete entfernt Treffer ohne Bestätigung oder Möglichkeit zum Rückgängigmachen. Führe zuerst die Auswahl ohne Löschaktion aus und lies die Pfade. Ergänze erst dann -delete am Ende, wie in find /tmp/build -type f -name '*.tmp' -delete. Für eine Bestätigung vor jedem Eintrag fragt -ok rm {} \; vor der Ausführung des Löschbefehls nach.
Aktionen werden ausgeführt, während der Ausdruck ausgewertet wird. Steht -delete vor -name '*.tmp', erfolgt das Löschen, bevor diese Namensprüfung es einschränken kann. Eine spätere Prüfung kann einen Eintrag nicht vor einer bereits ausgeführten Aktion schützen.
Bei Bedarf eine schnellere Suche wählen
locate guide.txt durchsucht einen Index gespeicherter Pfade, die „guide.txt“ enthalten. Der Befehl kann schnell antworten, ohne den Datenträger zu durchlaufen. Da die Datenbank regelmäßig aktualisiert wird, kann eine neue Datei fehlen oder ein gelöschter Pfad erhalten bleiben. updatedb erstellt den Index neu; eine systemweite Aktualisierung benötigt gewöhnlich Administratorrechte. Manche Distributionen benötigen ein optionales Paket wie plocate.
which grep durchsucht die Verzeichnisse in PATH nach einer ausführbaren Programmdatei und meldet oft /usr/bin/grep. Es beschreibt nicht alle Arten, wie Bash einen Befehl auflöst. type echo kann zum Beispiel einen eingebauten Befehl erkennen, selbst wenn auch ein externes Programm namens „echo“ existiert. Verwende type commandname für die Interpretation durch Bash, find für eine aktuelle Suche im Verzeichnisbaum und locate für eine schnelle Namenssuche im Index.
Wichtige Erkenntnisse
-exec command {} \;wird einmal pro Pfad ausgeführt;{} +fasst Pfade zusammen.- Verwende
findfür Dateieigenschaften und grep für Inhalte und kombiniere beide bei Bedarf. - Prüfe vor dem Löschen die Treffer und setze
-deletedanach hinter die einschränkenden Prüfungen. locatedurchsucht einen Index, der veraltet sein kann.whichfindet ausführbare Dateien in PATH;typeerklärt die Befehlsauflösung durch Bash.
6Textdateien in nano und vi bearbeiten
Mit Terminaleditoren kannst du Notizen und Konfigurationsdateien während einer entfernten Sitzung oder auf einem System ohne grafischen Desktop ändern. In nano kannst du sofort tippen und siehst Tastenkombinationen am unteren Bildschirmrand. vi weist Tasten in verschiedenen Modi unterschiedliche Aufgaben zu, sodass das Wechseln der Modi zur Bearbeitung gehört. Übe, eine Datei zu öffnen, Text zu finden, eine kleine Änderung vorzunehmen und bewusst zu speichern oder den Editor zu verlassen; diese Schritte sind genauso wichtig wie die Kenntnis eines Löschbefehls.
6.1 Eine Datei in nano bearbeiten und speichern
nano notes.txt öffnet Text in einem Terminaleditor. Du kannst dich mit den Pfeiltasten bewegen und direkt in den Text schreiben. Existiert die Datei nicht, beginnt nano mit einem leeren Puffer, dem im Arbeitsspeicher gehaltenen Text; beim Speichern wird die Datei auf dem Datenträger erstellt.
Die Beschriftungen der Tastenkombinationen lesen
Die untersten Zeilen zeigen Tastenkombinationen. ^ bedeutet Strg, also bedeutet ^X Strg+X. M- bedeutet Meta, meist Alt, also bedeutet M-U Alt+U. Strg+G öffnet die Hilfe. Diese Beschriftungen bezeichnen gleichzeitig zu drückende Tasten, keine Zeichen, die in die Datei einzutippen sind.
Eine kleine Änderung vornehmen und speichern
Um „port=8080“ in app.conf in „port=9090“ zu ändern:
- Führe
nano app.confaus. - Drücke Strg+W, gib „8080“ ein und drücke die Eingabetaste.
- Lösche am Treffer die vier Ziffern und gib „9090“ ein.
- Drücke Strg+O und dann die Eingabetaste, um den Dateinamen zu bestätigen und zu speichern.
- Drücke Strg+X, um den Editor zu verlassen.
Zurück in der Shell sollte grep 'port' app.conf „port=9090“ anzeigen. Das prüft die gespeicherte Datei und nicht nur, was im Editor sichtbar war.
Strg+O ist Speichern (Write Out) und kein Befehl zum Öffnen einer Datei. Strg+R liest den Inhalt einer anderen Datei an der Cursorposition in den aktuellen Puffer ein. Wenn du diese Aktionen verwechselst, kann unerwünschter Text in die bearbeitete Datei eingefügt werden.
Suchen, ersetzen und bewegen
Strg+W sucht nach Text. Alt+G geht zu einer angegebenen Zeilennummer, was nützlich ist, wenn eine Fehlermeldung eine bestimmte Zeile nennt. Strg+C zeigt die aktuelle Zeile und Spalte.
Alt+R, auch als Strg+\ verfügbar, startet eine Ersetzung. Gib den gesuchten Text und dann seinen Ersatz ein. Antworte für jeden Treffer mit Y zum Ersetzen oder N zum Überspringen; A ersetzt alle. Die Auswahl einzelner Ersetzungen hilft, wenn dieselben Ziffern in mehreren Einstellungen erscheinen und nur eine geändert werden soll.
Text verschieben und Änderungen rückgängig machen
| Tastenkombination | Aktion |
|---|---|
| Strg+K | Die gesamte aktuelle Zeile ausschneiden |
| Strg+U | Ausgeschnittenen Text am Cursor einfügen |
| Alt+A | Markierung eines Textbereichs beginnen |
| Alt+U / Alt+E | Rückgängig machen / wiederherstellen |
Wiederholtes Drücken von Strg+K sammelt aufeinanderfolgende Zeilen. Bei einem markierten Textbereich schneidet Strg+K den markierten Text statt der ganzen Zeile aus. Strg+U fügt diesen Text dann an der Cursorposition ein. Das Rückgängigmachen ist unmittelbar nach einem versehentlichen Ausschneiden oder Ersetzen nützlich.
Den Editor bewusst verlassen
Strg+X beendet den Editor. Hat der Puffer ungespeicherte Änderungen, fragt nano, ob er gespeichert werden soll. Y speichert, danach bestätigt die Eingabetaste den Namen; N beendet ohne Speichern dieser Änderungen; Strg+C bricht das Beenden ab und kehrt zur Bearbeitung zurück. Mit N entscheidest du dich, Arbeit zu verwerfen; damit setzt du die Bearbeitung nicht fort.
nano -l app.conf zeigt Zeilennummern und nano +12 app.conf beginnt in Zeile 12. Schlägt das Speichern fehl, weil dir die Berechtigung fehlt, wurde der bearbeitete Puffer nicht unter diesem Pfad gespeichert. Systemdateien benötigen passende Rechte, zum Beispiel sudo nano /etc/hosts, wenn eine autorisierte Systemänderung Administratorzugriff benötigt. Verwende zum Üben eine Datei in deinem eigenen Verzeichnis.
Wichtige Erkenntnisse
- nano nimmt eingegebenen Text sofort an; eine neue Datei wird beim Speichern erstellt.
^bedeutet Strg undM-in den Beschriftungen der Tastenkombinationen meist Alt.- Strg+O und die Eingabetaste speichern; Strg+X beendet und fragt nach ungespeicherten Änderungen.
- Strg+W sucht, Alt+R ersetzt und Alt+G geht zu einer Zeile.
- Strg+K schneidet aus, Strg+U fügt ein und Alt+U macht rückgängig.
6.2 In den verschiedenen Modi von vi arbeiten
vi notes.txt öffnet einen Terminaleditor im Normalmodus. Eine Taste wie x ist dort ein Befehl. Um Text einzugeben, wechsle zuerst in den Einfügemodus. Auf vielen Linux-Systemen startet vi Vim oder einen anderen vi-kompatiblen Editor.
Den Modus im Blick behalten
| Modus | Aufgabe | So wechselst du hinein |
|---|---|---|
| Normalmodus | Bewegen, löschen, kopieren und Befehle geben | Esc |
| Einfügemodus | Text in den Puffer eingeben | i, a, o oder ein anderer Einfügebefehl |
| Befehlszeilenmodus | Befehle wie Speichern eingeben | : aus dem Normalmodus |
Vim zeigt während des Einfügens „-- INSERT --“ an. Esc führt in den Normalmodus zurück. Aus dem Normalmodus fügt i vor dem Cursor ein und a danach. I beginnt vor dem ersten Zeichen der Zeile, das kein Leerzeichen ist, und erhält die Einrückung; A fügt am Ende an. o öffnet eine Zeile darunter und O eine Zeile darüber.
Bewegen, ohne Text einzugeben
Im Normalmodus bewegen h, j, k und l nach links, unten, oben und rechts. Auch die Pfeiltasten funktionieren. w geht zum nächsten Wort, 0 zum Zeilenanfang und $ zum Zeilenende. G springt zur letzten Zeile. 1G springt zur ersten; Vim bietet auch gg. Eine Zahl vor G wählt eine Zeile aus, sodass 12G zu Zeile 12 springt. :12 und die Eingabetaste bewirken dasselbe. Anzahlen wiederholen auch Bewegungen: 5j geht fünf Zeilen nach unten.
Vom Normalmodus aus bearbeiten
x löscht das Zeichen unter dem Cursor. dd schneidet eine Zeile aus; 3dd schneidet drei Zeilen aus. yy kopiert eine Zeile. Bei ganzen Zeilen fügt p unter der aktuellen Zeile ein und P darüber. Bei zeichenweisem Text fügt p nach dem Cursor ein und P davor.
cw ersetzt den Rest des aktuellen Wortes und wechselt in den Einfügemodus. r gefolgt von einem Zeichen ersetzt nur ein Zeichen. u macht eine Änderung rückgängig; Strg+R in Vim stellt sie wieder her. Ein Punkt . wiederholt die letzte Änderung.
Eine Einstellung finden und ändern
Um „8080“ in app.conf durch „9090“ zu ersetzen, führe vi app.conf aus, gib dann /8080 ein und drücke die Eingabetaste. Gib bei der ersten „8“ cw und dann „9090“ ein und drücke Esc. Gib :wq ein und drücke die Eingabetaste, um zu speichern und den Editor zu verlassen.
Suche mit ?text und der Eingabetaste rückwärts. n wiederholt die aktuelle Suchrichtung und N kehrt sie um. Die Suche akzeptiert reguläre Ausdrücke. Um jedes Vorkommen in einer Datei zu ersetzen, verwendet :%s/8080/9090/g % für alle Zeilen und g für alle Vorkommen in jeder Zeile. :set number zeigt beim Bearbeiten Zeilennummern an.
Bewusst speichern oder beenden
Im Normalmodus speichern :w und die Eingabetaste; :w newname.txt speichert unter einem neuen Namen. :q beendet nur, wenn keine ungespeicherten Änderungen dies verhindern. :wq, :x oder ZZ speichert und beendet. :q! verwirft ungespeicherte Änderungen und beendet.
Wenn die Eingabe unerwartet den Cursor bewegt oder Text löscht, drücke Esc, um in den Normalmodus zu gelangen, und verwende dann u, um unerwünschte Änderungen rückgängig zu machen, bevor du fortfährst. Wechsle in den Einfügemodus, bevor du den Ersatztext eingibst. Entscheide beim Verlassen eines Bearbeitungsversuchs, ob du speichern oder verwerfen willst; das Ausrufezeichen in :q! erlaubt das Verwerfen ungespeicherter Arbeit.
Wichtige Erkenntnisse
- vi startet im Normalmodus; wechsle zum Tippen in den Einfügemodus und drücke Esc, um zurückzukehren.
i,a,ound ihre großgeschriebenen Formen wählen, wo das Einfügen beginnt.ddschneidet eine Zeile aus,yykopiert sie undpfügt ganze Zeilen darunter oder zeichenweisen Text nach dem Cursor ein.umacht rückgängig und.wiederholt die letzte Änderung./textsucht vorwärts;nwiederholt undNkehrt die Suchrichtung um.:wqspeichert und beendet;:q!verwirft ungespeicherte Änderungen und beendet.
Linux-Pipes und Textverarbeitung: Beispiele
1Eine Datei lesen, ohne die Orientierung zu verlieren
10 Schritte
- 1EinführungWählen, wie viel Text angezeigt wird
Ein Terminal kann eine ganze Datei, jeweils eine Bildschirmseite oder nur einen ausgewählten Teil anzeigen. Die Wahl beeinflusst, wie leicht du das Wichtige findest.
Verwende eine kurze Notiz, um
catkennenzulernen, und wechsle dann zulessfür eine Datei, die zu lang für den Bildschirm ist. Verwende schließlichheadundtail, wenn du den benötigten Teil kennst. Diese Befehle lesen Text, ohne die gespeicherte Datei zu bearbeiten. - 2BeispielZwei kurze Notizen zusammenfügen
a.txtenthält „a“ und „b“ in getrennten Zeilen.b.txtenthält „c d“. Führecat -n a.txt b.txtaus.Die Ausgabe enthält drei nummerierte Zeilen in dieser Reihenfolge. Die Nummerierung läuft von der ersten Datei in die zweite weiter; die Nummern werden nur zur Ausgabe hinzugefügt. Um den ursprünglichen zusammengefügten Text ohne Nummerierung zu speichern, führe
cat a.txt b.txt > ab.txtaus. - 3ErklärungEine Leseansicht öffnen
Führe
less /etc/servicesaus, um eine lange Datei bildschirmweise zu lesen. Das Programm hält die Ansicht offen und wartet auf Navigationstasten.Die Leertaste geht eine Bildschirmseite vorwärts,
bzurück und die Pfeiltasten bewegen durch Zeilen.gspringt zur ersten Zeile;Gzur letzten. Drückeq, um die Ansicht zu schließen und zur Shell zurückzukehren. Eine fehlende Eingabeaufforderung der Shell ist normal, solange der Pager geöffnet ist. - 4BeispielSuchen und fortsetzen
Gib in
less/sshein und drücke die Eingabetaste, um vorwärts nach „ssh“ zu suchen. Drückenfür den nächsten Treffer in dieser Richtung oderN, um in die entgegengesetzte Richtung zu gehen.Eine Rückwärtssuche beginnt mit
?ssh. Nach dieser Suche setztnsie rückwärts fort. Die Richtung ergibt sich aus der Suche, die du gestartet hast.less -N fileergänzt Zeilennummern, wenn du die Position eines Treffers notieren möchtest. - 5HerausforderungDen vorherigen Treffer finden
Du hast in einer langen Datei mit less vorwärts nach „listen“ gesucht. Du möchtest zum vorherigen Treffer und dann den Pager verlassen. Welche Tasten drückst du?
---reveal---
Drücke
N, um entgegen der Vorwärtssuche zu gehen, und dannqzum Beenden. Das kleingeschriebenenwürde vorwärts fortsetzen. Erst das Beenden stellt die Eingabeaufforderung der Shell wieder her; das Erreichen eines Treffers oder des Dateiendes schließt den Pager nicht. - 6ErklärungEine Anzahl oder eine Startzeile wählen
head -n 4 filegibt die ersten vier Zeilen aus.tail -n 4 filegibt die letzten vier aus. Ohne-ngeben beide standardmäßig zehn Zeilen aus.Ein Pluszeichen ändert die Aufgabe von tail:
tail -n +4 filebeginnt bei Zeile 4 und gibt alles ab dort aus. Bei einer Datei mit einer Kopfzeile entfernttail -n +2 filediese Kopfzeile. Der Befehl behält alle Datensätze, nicht nur die letzten zwei. - 7BeispielDie Zeilen 11 bis 20 auswählen
Angenommen, eine Datei enthält die Zahlen 1 bis 100, eine pro Zeile. Beginne mit
head -n 20 numbers.txt, das 1 bis 20 behält.Ergänze
| tail -n 10. Die letzten zehn Zeilen der ausgewählten Eingabe sind 11 bis 20. Beide Endpunkte zählen mit, daher enthält dieser Bereich zehn Zeilen. Würdest du bei tail elf Zeilen anfordern, wäre auch Zeile 10 enthalten und der Anfang nach hinten verschoben. - 8HerausforderungEinen anderen Bereich aus der Mitte wählen
Eine Datei hat mindestens 17 Zeilen. Schreibe eine Pipeline mit head und tail, die die Zeilen 12 bis 17 einschließlich beider Enden ausgibt.
---reveal---
Verwende
head -n 17 file | tail -n 6. Behalte zuerst die Zeilen 1–17 und davon dann die letzten sechs: 12, 13, 14, 15, 16 und 17. Bei einer Anzahl von fünf würde Zeile 12 fehlen, weil die Endpunkte im angeforderten Bereich enthalten sind. - 9HerausforderungDen neuesten Text ansehen und weiter beobachten
Du möchtest die neuesten Einträge einer langen Anwendungsdatei sehen und weiter beobachten, wie neue Einträge hinzukommen. Welcher Befehl passt und wie verlässt du ihn?
---reveal---
Verwende
tail -f app.logund drücke Strg+C, wenn du fertig bist. Das einfachetailwürde das aktuelle Ende anzeigen und sich beenden.tail -Fist nützlich, wenn das Programm die Datei bei der Rotation ersetzt, weil es den Dateinamen beim Ersetzen weiterverfolgt. - 10ZusammenfassungDie passende Ansicht für die Aufgabe verwenden
Verwende für eine ganze kurze Datei
cat; öffne zum Navigieren und Suchenless. Ein Pager bleibt geöffnet, bis du ihn beendest.Verwende
headundtailfür den Anfang, das Ende oder einen Bereich aus der Mitte. Lies ein Pluszeichen bei der Zeilenanzahl von tail als Startposition. Für eine laufende Ansicht verfolge angehängten Text mittail -fund beende mit Strg+C. Dieselbe Auswahl funktioniert auch, wenn der Text durch eine Pipe ankommt.
2Eingabe, Ergebnisse und Fehler nachverfolgen
11 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDrei getrennte Wege zeichnen
- 2ErklärungDie Standardströme benennen
- 3BeispielDieselben Daten über einen anderen Weg einspeisen
- 4HerausforderungDie Tastatureingabe abschließen
- 5BeispielMehrere Zeilen unter einem Befehl bereitstellen
- 6ErklärungErsetzen oder Anhängen wählen
- 7BeispielErgebnisse und Diagnosemeldungen zusammenführen
- 8HerausforderungDie Reihenfolge der Verbindungen umkehren
- 9TippDie Eingabe intakt halten
- 10HerausforderungEingabe zählen und eine Diagnosemeldung trennen
- 11ZusammenfassungDie Einrichtung durch die Shell nachvollziehen
3Einen nützlichen Textbericht erstellen
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungJeder Stufe eine Aufgabe geben
- 2ErklärungDie beiden Befehle verbinden
- 3HerausforderungEine Pipe oder eine Datei wählen
- 4ErklärungWissen, was der Zähler misst
- 5BeispielSortieren und Zählen unterscheiden
- 6HerausforderungEin verbleibendes Duplikat erklären
- 7ErklärungDie relevante Spalte auswählen
- 8BeispielDie Beschriftung entfernen und die Werte untersuchen
- 9HerausforderungEine Annahme über das Trennzeichen prüfen
- 10BeispielDie ausgewählten Werte gruppieren
- 11BeispielDie Anzahlen ordnen
- 12VerbindungEin Zwischenergebnis vor der abschließenden Zählung behalten
- 13HerausforderungEine zusätzliche Kategorie untersuchen
- 14ZusammenfassungPrüfen, was zwischen den Stufen übertragen wird
4Muster für den gewünschten Text aufbauen
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEntscheiden, was als Treffer zählt
- 2ErklärungEine Suchausgabe wählen
- 3BeispielEin Wort von einer Zeile unterscheiden
- 4HerausforderungNach einer genauen Versionsbezeichnung suchen
- 5TippEin Verzeichnis durchsuchen oder eine Suche ohne Ausgabe durchführen
- 6ErklärungEinen Treffer innerhalb der Zeile positionieren
- 7BeispielEin Zeichen aus einer Menge auswählen
- 8KernaussageNull Vorkommen erlauben
- 9HerausforderungEine literale Dateinamenendung finden
- 10ErklärungErweiterte Operatoren einschalten
- 11BeispielEinen vollständigen Code prüfen
- 12BeispielEine Auswahl oder einen wiederholten Teil gruppieren
- 13HerausforderungTeile extrahieren und ihre Grenzen untersuchen
- 14HerausforderungNur aktive Einstellungen behalten
- 15ZusammenfassungMuster und Ausgabe getrennt prüfen
5Dateien auswählen, bevor du sie bearbeitest
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungNamen und Inhalte unterscheiden
- 2ErklärungDas Startverzeichnis wählen
- 3BeispielTyp und Name kombinieren
- 4HerausforderungDen Platzhalter für find erhalten
- 5ErklärungAufgerundete Größeneinheiten vergleichen
- 6HerausforderungDie Tagesschwelle richtig lesen
- 7ErklärungPfade als Argumente übergeben
- 8BeispielNur ausgewählte Inhalte durchsuchen
- 9TippEine destruktive Aktion hinter ihre Prüfungen setzen
- 10ErklärungEinen Index oder eine Befehlssuche wählen
- 11HerausforderungEine aktuelle Inhaltsprüfung wählen
- 12ZusammenfassungDie Suche auf die benötigten Informationen abstimmen
6Eine kleine Änderung im Terminal vornehmen und speichern
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungArbeitstext von gespeichertem Text unterscheiden
- 2ErklärungDie Bedienelemente von nano lesen
- 3BeispielEinen Wert finden und ersetzen
- 4HerausforderungEine Zeile verschieben und einen Fehler rückgängig machen
- 5TippMit der Nachfrage beim Beenden umgehen
- 6ErklärungIn den Einfügemodus von vi wechseln
- 7BeispielZum benötigten Text navigieren
- 8BeispielDie Einstellung in vi ändern
- 9HerausforderungDen kopierten Text passend zu seiner Art einfügen
- 10TippKleine Änderungen vornehmen und rückgängig machen
- 11HerausforderungEntscheiden, ob die Änderung in vi erhalten bleiben soll
- 12HerausforderungZwei ungespeicherte Änderungen vergleichen
- 13ZusammenfassungMit bewusstem Speichern oder Verwerfen abschließen
Linux-Pipes und Textverarbeitung: Übungsaufgaben
Set 1: Text lesen und seinen Weg verfolgen10 Übungsfragen
Frage 1 von 10
less. Welche einzelne Taste bringt dich zur Shell zurück?Antwort zeigenAntwort ausblenden
q, um den Pager zu beenden und zur Eingabeaufforderung der Shell zurückzukehren. g bewegt zum Anfang der Datei, hält den Pager aber geöffnet und kann daher die Eingabeaufforderung nicht wiederherstellen. Fehlt diese Aufforderung beim Lesen, verarbeitet less weiterhin deine Tasten.Frage 2 von 10
tail -n +3 records.txt aus?Antwort zeigenAntwort ausblenden
tail -n 3 die letzten drei Zeilen auswählen. Zwei Anfangszeilen zu entfernen und drei Endzeilen auszuwählen sind unterschiedliche Vorgänge.Frage 3 von 10
> report.txt gespeichert, seine Diagnosemeldungen bleiben aber sichtbar. Welcher Datenstrom transportiert diese Meldungen?Antwort zeigenAntwort ausblenden
> leitet nur stdout um, weshalb Fehler auf dem Bildschirm bleiben können. Dass beide standardmäßig das Terminal nutzen, macht sie nicht zu demselben Datenstrom.Frage 4 von 10
Antwort zeigenAntwort ausblenden
>> hängt stdout an, erhält den vorhandenen Text der Datei und erstellt die Datei bei Bedarf. Ein einzelnes > öffnet die Datei, nachdem es ihren alten Inhalt geleert hat. 2> leitet Diagnosemeldungen statt normaler Ergebnisse um und wählt damit für diese Aufgabe auch den falschen Datenstrom.Frage 5 von 10
command | wc -l?Antwort zeigenAntwort ausblenden
wc -l weiter, was die Anzahl 5 ergibt. Die zwei stderr-Zeilen behalten ihren getrennten Weg und gelangen nicht zum Zähler. Für die Anzahl 7 müsste stderr vor der Pipe mit stdout zusammengeführt werden, was diese Befehlszeile nicht tut.Frage 6 von 10
sort -n?Antwort zeigenAntwort ausblenden
-n ändert den Vergleich; sie kehrt nicht bloß die standardmäßige Textreihenfolge um.Frage 7 von 10
supplies.txt enthält „clip“, „ring“, „clip“, „pad“, „clip“, „ring“ und „clip“, jeweils mit abschließendem Zeilenvorschub. Welche zwei Zeilen stehen bei sort supplies.txt | uniq -c | sort -rn | head -n 2 vorn, wenn du die auffüllenden Leerzeichen vor den Anzahlen ignorierst?Antwort zeigenAntwort ausblenden
Frage 8 von 10
grep -ic 'fail' file?Antwort zeigenAntwort ausblenden
-w benötigen, die dieser Befehl nicht enthält.Frage 9 von 10
docs/a.txt, ein Verzeichnis docs/b.txt und eine reguläre Datei docs/c.TXT. Was wählt find docs -type f -name '*.txt' aus?Antwort zeigenAntwort ausblenden
a.txt erfüllt beides. b.txt besteht die Typprüfung nicht, während c.TXT bei demselben Endungsmuster die Prüfung -iname ohne Unterscheidung der Groß- und Kleinschreibung benötigen würde.Frage 10 von 10
Antwort zeigenAntwort ausblenden
Set 2: Befehle wählen und Treffer interpretieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
n nach einer Rückwärtssuche mit ?queue in less?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
labels.txt hat acht Zeilen mit abschließendem Zeilenvorschub. Wie unterscheidet sich die Ausgabe von wc -l < labels.txt von der von wc -l labels.txt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
command 2>&1 > result.txt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
teams.csv enthält „name,team“, „Uma,Blue“, „Zed,Gold“, „Ivo,Blue“ und „Moe,Gold“, jeweils mit abschließendem Zeilenvorschub. Was meldet cut -d, -f2 teams.csv | sort | uniq | wc -l?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
build.txt nach dem literalen Text „v3.8“, einschließlich des tatsächlichen Punktes?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
grep '^d.g$' file?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
grep '^ba*t$' file?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
.txt-Dateien, die „REVIEW“ enthalten. Welcher Befehl wendet alle drei Einschränkungen an?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
yy und drückst p. Wo erscheint die kopierte Zeile?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Pipelines nachvollziehen und Fehler korrigieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
echo done > state.txt seine Ausgabe schreibt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
parts.txt enthält „pin“, „bolt“, „pin“, „nut“ und „bolt“, jeweils mit abschließendem Zeilenvorschub. Was tut sort parts.txt | uniq | tee distinct.txt | wc -l?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
runs.txt enthält „b“, „a“, „b“, „a“ und „a“, jeweils in einer eigenen Zeile. Welches Paar aus Anzahl und Wert steht bei uniq -c runs.txt | sort -rn an erster Stelle?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
cut -d: -f3,1 aus der Zeile „Nia:ops:42“ aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
grep -E '^(go)+$' file?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
grep -Eo '[0-9]{1,2}' aus dieser Zeile?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
-size -1M von GNU find?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
locate plan.txt einen Pfad anzeigen, der heute Morgen gelöscht wurde?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Abläufe mit Dateien und Text diagnostizieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
ls -lt erzeugt eine Kopfzeile „total“, gefolgt von Dateieinträgen. Wie viele Einträge zeigt ls -lt | head -n 6 an, wenn mindestens sechs Einträge vorhanden sind?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
sort am Anfang einer leeren Zeile das Ende der Eingabe?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
command 2>&1 | tee combined.txt | wc -l?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
cut -d' ' -f2 aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
grep -icw 'alert' file?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
find . -type f -name '*.cfg' -mtime +30 aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
I vom Normalmodus aus mit dem Einfügen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Regeln in ungewohnten Fällen kombinieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
log.txt als auch err.txt enthalten bereits älteren Text. Was geschieht bei command >> log.txt 2> err.txt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
sizes.csv enthält „name,size“, „alpha,8“, „beta,110“ und „gamma,24“. Welche Pipeline gibt die zwei vollständigen Datensätze mit den größten numerischen Größen zuerst aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
jobs.csv enthält „id,zone“, „1,North“, „2,South“, „3,North“, „4,East“ und „5,North“. Welches Paar aus Anzahl und Wert steht im Ergebnis von tail -n +2 jobs.csv | cut -d, -f2 | sort | uniq -c | sort -rn an erster Stelle?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
grep '^r[^ae]d$' file?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
grep -Ev '^[[:space:]]*(#|$)' file erhalten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
echo verwenden?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
x ein Zeichen. Danach drückst du p. Wo wird dieses Zeichen eingefügt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
work, ohne Dateien aus tieferen Verzeichnissen. Welche Suche leistet das?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Abschneiden
>-Umleitung öffnet, bevor der Befehl Eingaben zu lesen beginnt.sort names.txt > names.txt verliert die ursprünglichen Daten, weil das Abschneiden zuerst geschieht.Alternation
| aus, häufig mit runden Klammern zur Begrenzung des Geltungsbereichs der Auswahl.^(east|west)$ müssen beide Alternativen die ganze Zeile ausfüllen, weil sie dieselben Anker verwenden.Anhängen
>> verwendet.>> report.txt sammeln ihre Ergebnisse in einer Datei, statt sie zu ersetzen.Anker
^ auf den Anfang oder $ auf das Ende einer Zeile bei gewöhnlichen grep-Suchen.d.g beide Anker hinzufügst, wird eine längere Zeile wie „undog“ ausgeschlossen, obwohl sie „dog“ enthält.Ä
Änderungszeitpunkt
-mtime von find prüft das seitdem vergangene Alter in abgeschlossenen Zeiträumen von 24 Stunden.-mtime +30 nicht, weil erst 30 vollständige Tageszeiträume vergangen sind.B
Befehlszeilenmodus
: eingegeben wurde, und führt ihn beim Drücken der Eingabetaste aus.:wq speichert den Puffer und beendet nach der Eingabetaste den Editor; ein einfaches wq im Normalmodus tut dies nicht.C
cat
cat ist ein Befehl, der die Inhalte einer oder mehrerer Dateien in der Reihenfolge seiner Dateiargumente auf die Standardausgabe ausgibt.cat -n a.txt b.txt nummeriert ihre zusammengefügte Ausgabe, ohne eine der Eingabedateien zu bearbeiten.cut
cut ist ein Filter, der Felder oder feste Zeichenpositionen aus jeder Eingabezeile auswählt und die ausgewählten Teile in ihrer ursprünglichen Reihenfolge erhält.cut -d: -f1,6 /etc/passwd stellt jeden Kontonamen seinem Home-Verzeichnisfeld gegenüber.D
Dateideskriptor
2 in 2> errors.txt wählt den Fehlerstrom und muss direkt am Umleitungsoperator stehen.Dateitypprüfung
f für eine reguläre Datei, d für ein Verzeichnis oder l für einen Link.-type f verhindert, dass ein Verzeichnis namens „old.txt“ bei einer Suche nach Textdateien ausgewählt wird.Deskriptorduplizierung
2>&1 es für stderr und stdout tut.command > all.txt 2>&1 erhält stderr die Dateiverbindung, die stdout bereits hat.E
Einfügemodus
i, a oder o gestartet und mit Esc beendet.cw den Rest eines Wortes entfernt hat, gib den Ersatz im Einfügemodus ein und drücke dann Esc.Ersetzung
:%s/old/new/g ersetzt jedes passende „old“ in jeder Zeile der Datei.Erweiterter regulärer Ausdruck
?, +, |, geschweiften und runden Klammern ihre besonderen Bedeutungen ohne umgekehrte Schrägstriche.grep -E vor einem gruppierten Muster wie ^(red|blue)$, um die Alternative zu aktivieren.Extraktion von Treffern
-o von grep für jeden nicht leeren Treffer tut.grep -Eo '[0-9]+' die beiden Zahlen in getrennten Zeilen aus.F
Feld
cut nummeriert Felder ab 1 und wählt sie anhand des Trennzeichens im Datensatz aus.Filter
sort, cut und grep wirken jeweils als Filter, wenn sie Text von einem vorherigen Befehl erhalten.find
find durchsucht einen Verzeichnisbaum ab angegebenen Startpfaden, prüft die Eigenschaften jedes erreichten Eintrags und gibt ausgewählte Pfade aus oder führt Aktionen für sie aus.find notes -type f -name '*.txt' wählt im gesamten Verzeichnisbaum reguläre Dateien mit Namen aus, die auf Textdateien hinweisen.find -exec
find -exec führt einen anderen Befehl für ausgewählte Pfade aus, ersetzt dabei {} und beendet die Aktion mit einem maskierten Semikolon oder einem Pluszeichen.-exec wc -l {} + übergibt mehrere passende Pfade gesammelt an einen Befehl, der ihre Zeilen zählt.G
Ganzworttreffer
grep -w error file findet „error found“, aber nicht die Teilzeichenfolge in „terror“.grep
grep ist ein Textsuchbefehl, der normalerweise jede Eingabezeile ausgibt, die einen Treffer für ein Muster enthält, und Optionen zum Ändern der Ausgabe bietet.grep -n WARN app.log, um passende Zeilen zusammen mit ihren Positionen in der Datei anzuzeigen.Gruppe
(ab)+ erlaubt „ab“ und „abab“, weil das Plus die vollständige Gruppe aus zwei Zeichen wiederholt.H
Häufigkeitszählung
sort gruppiert und Folgen mit uniq -c gezählt werden.sort -rn nach uniq -c hinzu, um bei der Untersuchung häufiger Einträge die größten Anzahlen an den Anfang zu stellen.head
head ist ein Filter, der den Anfang seiner Eingabe ausgibt und standardmäßig zehn Zeilen oder auf Anforderung eine andere Anzahl von Zeilen oder Bytes auswählt.head -n 4 notes.txt, bevor du entscheidest, ob du die ganze Datei benötigst.Here-Dokument
cat <<EOF sind die vor dem abschließenden EOF eingegebenen Zeilen Daten, während diese letzte Zeile eine Markierung ist.Here-String
wc -w <<< "red blue green" erhält drei Wörter, ohne eine separate Eingabedatei zu benötigen.K
Klammerausdruck
b[ae]t passt auf „bat“ oder „bet“, während b[^a]t „a“ an der mittleren Position ausschließt.Kopieren (Yank)
yy es für eine ganze Zeile tut, ohne diese Zeile aus dem Arbeitspuffer zu entfernen.yy gefolgt von p, um eine Zeile unter ihrer ursprünglichen Position in der Datei zu duplizieren.L
Leeres Feld
less
less ist ein Pager, mit dem du vorwärts und rückwärts navigieren, Text durchsuchen und Dateien oder Ausgaben aus einer Pipe ansehen kannst, ohne den Text zu bearbeiten.less -N notes.txt, wenn du beim Suchen einer bestimmten Stelle in einer Datei Zeilennummern sehen möchtest.locate
locate ist eine schnelle Suche nach Pfadnamen in einer vorbereiteten Datenbank, deren Inhalt Änderungen im aktuellen Dateisystem hinterherhinken kann.M
Markierter Textbereich
Maskierung
\.txt$ verlangt eine literale Endung „.txt“, während .txt$ ein anderes Zeichen vor „txt“ erlaubt.Metazeichen
* vor der Shell, aber grep interpretiert es weiterhin als Operator eines regulären Ausdrucks, wenn es das Zeichen erhält.Modaler Editor
N
Namensprüfung
-name von find unterscheidet zwischen Groß- und Kleinschreibung, während -iname sie ignoriert.-name 'plan*' akzeptiert „plan.txt“, während -name 'plan' genau diesen Namen verlangt.nano
nano ist ein Terminal-Texteditor, der eingegebenen Text direkt annimmt und Tastenkombinationen zum Speichern, Suchen, Ausschneiden und Beenden anzeigt.nano +12 app.conf, wenn ein Programm meldet, dass eine Einstellung in Zeile 12 überprüft werden muss.noclobber
>-Umleitungen auf vorhandene reguläre Dateien verhindert und so vor versehentlichem Ersetzen schützt.set -o noclobber >| nur, wenn du den Schutz vorhandener Dateien absichtlich außer Kraft setzen möchtest.Normalmodus
dd, um die aktuelle Zeile auszuschneiden, ohne versehentlich diese beiden Buchstaben einzugeben.Nullgerät
/dev/null ist eine spezielle Datei, die geschriebene Daten verwirft, sodass ein ausgewählter Ausgabestrom bewusst ausgeblendet werden kann.2>/dev/null blendet Diagnosemeldungen einer Dateisuche aus, einschließlich Meldungen über unlesbare Verzeichnisse.Numerische Sortierung
sort -n, um „9“ vor „100“ zu setzen, wenn die Zeilen Mengen statt Bezeichnungen darstellen.P
Pager
less /etc/services und drücke dann die Leertaste für die nächste Bildschirmseite oder q zum Beenden.PATH
PATH ist die Liste der Verzeichnisse, die die Shell nach externen ausführbaren Befehlen durchsucht. Ein Werkzeug wie which nutzt sie zur Suche nach einer Programmdatei.which grep durchsucht Befehlsverzeichnisse, statt jedes Verzeichnis auf dem Computer zu durchsuchen.Pipe
grep -i error app.log | wc -l fließen ausgewählte Zeilen in den Befehl, der sie zählt.Pipeline
sort values.txt | uniq | wc -l misst die abschließende Zählung die Anzahl unterschiedlicher gruppierter Werte.Puffer
Q
Quantifizierer
? für optionalen Text oder {4} für genau vier Wiederholungen.[0-9]{4} verlangt vier Ziffern; Anker können festlegen, dass diese den gesamten Zeileninhalt bilden.R
Regulärer Ausdruck
^web[0-9]$ beschreibt eine ganze Zeile, die „web“ gefolgt von einer Ziffer enthält.Rekursive Suche
grep -r durchsucht Text in Dateien dieses Verzeichnisbaums.grep -rl TODO notes listet Namen passender Dateien auf, ohne ihren gesamten passenden Text auszugeben.Rückgabestatus
grep -q meldet ihr Ergebnis über den Status, ohne passende Zeilen auszugeben.S
Sortierschlüssel
sort -k ausgewählt und anhand des gewählten Trennzeichens bestimmt.-k3,3nr vergleicht bei einer Rangfolge von Punktzahlen nur Feld 3, numerisch und in umgekehrter Reihenfolge.Speichern (Write Out)
Standardausgabe
wc -l < names.txt > count.txt gelangt die Zeilenanzahl über die Standardausgabe in die Berichtsdatei.Standardeingabe
sort < names.txt verbindet die Shell die Datei vor der Ausführung mit der Standardeingabe des Befehls.Standardfehlerausgabe
> speicherst, kann eine Meldung über einen fehlenden Pfad auf der Standardfehlerausgabe sichtbar bleiben.Suche nach festen Zeichenfolgen
-F verwendet.grep -F "v2.4" releases.txt, um den tatsächlichen Punkt in der Versionsbezeichnung zu verlangen.Suchtiefe
-maxdepth von find begrenzt, wie weit die Traversierung in Unterverzeichnisse hinabsteigen darf.-maxdepth 1, um das Startverzeichnis und seine unmittelbaren Einträge zu untersuchen, ohne in tiefere Verzeichnisse einzutreten.T
tail
tail ist ein Filter, der das Ende seiner Eingabe ausgibt oder bei einer nummerierten Zeile beginnt, wenn der Zeilenanzahl ein Pluszeichen vorangestellt ist.tail -n +2 scores.csv, um eine einzeilige Kopfzeile wegzulassen und alle übrigen Datensätze zu behalten.tee
tee ist ein Filter, der seine Eingabe sowohl in eine benannte Datei als auch auf die Standardausgabe kopiert und so ein Ergebnis speichert, während die Pipeline weiterlaufen kann.tee selected.txt vor einer Zählstufe ein, wenn du die ausgewählten Zeilen auch untersuchen möchtest.Text mit fester Feldbreite
cut -c1-5 ausgewählt werden, selbst wenn späterer Text variiert.Traversierung
| sort an eine einfache Pfadsuche an, wenn die Reihenfolge ihrer ausgegebenen Ergebnisse vorhersehbar sein soll.Trennzeichen
cut -d wählt das Zeichen, an dem jede Zeile aufgeteilt wird.type
type ist ein eingebauter Bash-Befehl, der beschreibt, wie ein Befehlsname interpretiert wird, etwa als Alias, Funktion, eingebauter Befehl oder Pfad zu einer ausführbaren Datei.type echo kann einen eingebauten Befehl melden, selbst wenn which echo auf eine externe ausführbare Datei verweist.U
Umleitung
sort < names.txt > ordered.txt stellt die Shell eine Datei als Eingabe bereit und öffnet eine andere für die Ausgabe.uniq
uniq ist ein Filter, der benachbarte gleiche Zeilen erkennt und mithilfe von Optionen wiederholte Kopien entfernt oder ausgewählte Folgen und deren Anzahlen meldet.uniq -c sortierst, erscheint die vollständige Häufigkeit jedes Werts als eine Anzahl.updatedb
updatedb erstellt die Datenbank für indizierte Pfadsuchen neu, sodass ihr gespeicherter Stand die bei der Aktualisierung erfassten Pfade widerspiegelt.sudo updatedb ausführen, wenn eine sofortige systemweite Aktualisierung sinnvoll ist.V
Verfolgungsmodus
tail nach seiner anfänglichen Ausgabe auf angehängte Daten, sodass neuer Text erscheinen kann, während ein Programm in die Datei schreibt.tail -f app.log aus und drücke Strg+C, wenn du mit dem Beobachten fertig bist.Verkettung
cat nacheinander ausgegeben werden.cat first.txt second.txt > combined.txt steht der Text der ersten Datei vor dem Text der zweiten.W
wc
wc ist ein Zählbefehl, der standardmäßig Zeilenvorschübe, Wörter und Bytes meldet und Optionen bietet, um eine Größe auszuwählen oder Zeichen zu zählen.wc -c mit wc -m, um Bytes von Zeichen zu unterscheiden.Z
Zeichenklasse
[[:digit:]] wählt eine Ziffer aus; beide Paare eckiger Klammern sind nötig.Zeilenbereich
head die ersten 20 Zeilen und dann die letzten zehn dieser Auswahl.Zeilenvorschub
wc -l zählt diese Markierungen, sodass eine nicht abgeschlossene letzte Zeile die gemeldete Gesamtzahl nicht erhöht.Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.