Umleitung, Linux-Pipes und Textverarbeitung

Lerne, auf der Linux-Befehlszeile mit Text zu arbeiten. Sieh dir Dateien mit cat, less, head und tail an, leite Ausgaben und Fehlermeldungen in Dateien um und verknüpfe kleine Befehle zu Pipelines, die Text zählen, sortieren und ausschneiden. Durchsuche Dateien mit grep und regulären Ausdrücken, finde Dateien nach Name, Größe und Alter und bearbeite Konfigurationsdateien in den Terminaleditoren nano und vi.

AnfängerEinheit 3 von 7 in Kurs: Linux – Befehlszeile, Shellskripte und Systemverwaltung

Was du lernst

  1. 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 durchsehen
      Kurze 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 anzeigen
      Mit head und tail den Anfang oder das Ende einer Datei anzeigen, eine Kopfzeile überspringen, einen Zeilenbereich auswählen und eine wachsende Protokolldatei verfolgen.
  2. Die drei Standardströme eines Befehls erklären und Eingaben, Ausgaben und Fehlermeldungen von und in Dateien umleiten.
    • Standardeingabe, Standardausgabe und Standardfehlerausgabe verstehen
      Die 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 umleiten
      Ausgaben 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.
  3. 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 verbinden
      Mit 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 entfernen
      Zeilen, 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 extrahieren
      Mit 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.
  4. 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 durchsuchen
      Mit 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 schreiben
      Muster 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 verwenden
      Mit grep -E die Operatoren ?, +, { }, | und ( ) verwenden, um optionalen, wiederholten und alternativen Text zu finden, und nur die passenden Teile ausgeben.
  5. Dateien an beliebigen Stellen im Verzeichnisbaum mit find und locate finden und Befehle auf die gefundenen Dateien anwenden.
    • Den Verzeichnisbaum mit find durchsuchen
      Mit 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 nutzen
      Befehle auf jede von find gefundene Datei anwenden, Treffer sicher löschen und wissen, wann locate oder which das schnellere Werkzeug ist.
  6. 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 speichern
      Eine 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 arbeiten
      Zwischen Normalmodus, Einfügemodus und Befehlszeilenmodus von vi wechseln, sich mit Einzeltastenbefehlen bewegen und Text bearbeiten sowie speichern oder beenden, ohne Arbeit zu verlieren.

Linux-Pipes und Textverarbeitung einfach erklärt

6 Kapitel

1

Dateien 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:

TasteAktion
Leertaste oder fEine Bildschirmseite vorwärts
bEine Bildschirmseite zurück
Pfeil nach unten, Eingabetaste oder jEine Zeile nach unten
Pfeil nach oben oder kEine Zeile nach oben
g / GZur ersten / letzten Zeile springen
h / qHilfe 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

  • cat gibt Dateien in der angegebenen Reihenfolge aus; -n nummeriert die zusammengefügte Ausgabe.
  • less zeigt Text seitenweise an, ohne ihn zu bearbeiten; q kehrt zur Shell zurück.
  • In less sucht / vorwärts, ? rückwärts und n wiederholt die Suche in der aktuellen Richtung.
  • less -N zeigt Zeilennummern; mit less -S kannst 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:

BefehlBedeutung
tail -n 2 fileDie letzten zwei Zeilen ausgeben
tail -n +2 fileAb 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

  • head und tail geben standardmäßig 10 Zeilen aus; -n legt die Zeilenanzahl fest.
  • tail -n +K beginnt 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 -f verfolgt angehängten Text; Strg+C beendet das Verfolgen.
  • tail -F verfolgt einen Dateinamen auch beim Ersetzen der Datei, und -q unterdrückt Kopfzeilen bei mehreren Dateien.
2

Ein- 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:

NummerNameÜbliche Verbindung im Terminal
0Standardeingabe, stdinTastatureingabe
1Standardausgabe, stdoutNormale Ergebnisse auf dem Bildschirm
2Standardfehlerausgabe, stderrFehler 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.

OperatorWirkung
> out.txtstdout schreiben, vorhandenen Inhalt ersetzen
>> out.txtstdout anhängen
2> err.txtstderr schreiben, vorhandenen Inhalt ersetzen
2>> err.txtstderr 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>&1 fängt beide Datenströme auf, weil Umleitungen von links nach rechts ausgeführt werden.
  • 2>&1 > out.txt belässt stderr am früheren Ziel von stdout.
  • /dev/null verwirft den ausgewählten Datenstrom einschließlich nützlicher Diagnosemeldungen.
  • Vermeide Umleitungen auf eine Eingabedatei; sort -o bietet eine unterstützte Alternative.
  • noclobber in Bash verhindert gewöhnliches > bei vorhandenen regulären Dateien; >| setzt den Schutz außer Kraft.
3

Befehle 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.
  • tee speichert die Eingabe und gibt sie weiter; tee -a hä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.

OptionWas sie zählt
-lZeilenvorschubzeichen
-wDurch Leerraum getrennte Wörter
-cBytes
-mZeichen

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 -l zählt Zeilenvorschübe, -w Wörter, -c Bytes und -m Zeichen.
  • sort -n vergleicht Zahlen; -r kehrt die Reihenfolge um; -h verarbeitet Größensuffixe.
  • sort -t, -k3,3nr sortiert durch Kommas getrennte Datensätze nach Feld 3 numerisch absteigend.
  • Entferne eine Kopfzeile, bevor du Datensätze sortierst.
  • uniq entfernt benachbarte Wiederholungen; sortiere zuerst, wenn gleiche Werte verstreut sind.
  • uniq -c zählt Folgen, -d wählt wiederholte Werte und -u einmal vorkommende Werte aus.
  • sort | uniq -c | sort -rn gruppiert 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.

AuswahlAusgegebene Felder
-f1,3Felder 1 und 3
-f2-4Felder 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 -d legt das Trennzeichen fest und -f wählt ab 1 nummerierte Felder aus.
  • Feldlisten wählen Felder in ihrer ursprünglichen Reihenfolge aus; -c wählt feste Positionen.
  • Das Standardtrennzeichen ist ein Tabulator; -s lässt Zeilen ohne Trennzeichen weg.
  • Wiederholte Leerzeichen erzeugen leere Felder, und cut verarbeitet keine CSV-Anführungszeichen.
  • Für Häufigkeitszählungen entferne die Kopfzeile, wähle den Wert aus, gruppiere gleiche Zeilen und zähle sie.
4

Text 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
OptionErgebnis
-iTreffer ohne Unterscheidung der Groß- und Kleinschreibung
-vNicht passende Zeilen ausgeben
-cAnzahl der passenden Zeilen ausgeben
-nTreffern ihre Zeilennummern voranstellen
-wEinen Ganzworttreffer verlangen
-xEinen 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

  • grep gibt passende Zeilen aus und unterscheidet zwischen Groß- und Kleinschreibung, sofern nicht -i verwendet wird.
  • Setze das Muster in Anführungszeichen, damit die Shell es unverändert übergibt.
  • -c zählt passende Zeilen; -n nummeriert sie; -v wählt nicht passende Zeilen aus.
  • -w verlangt ein ganzes Wort und -x eine ganze Zeile.
  • -r durchsucht einen Verzeichnisbaum, -l listet Dateien mit Treffern auf und -L Dateien ohne Treffer.
  • -F behandelt ein Muster als festen Text; -q meldet 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:

MusterWas es verlangt
^cEine 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:

OperatorAnzahl 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 -E aktiviert 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.
  • -o gibt 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.
5

Dateien 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

  • find durchläuft einen Verzeichnisbaum ab einem Startpfad und gibt Einträge aus, die seine Prüfungen bestehen.
  • Setze Namensplatzhalter in Anführungszeichen; -name prüft den ganzen Namen und -path den vollständigen Pfad.
  • Verwende -type f, d oder l für reguläre Dateien, Verzeichnisse beziehungsweise symbolische Links.
  • Größenprüfungen runden vor dem Vergleich auf; -size -1M wählt nur leere Dateien aus.
  • -mtime +30 beginnt bei 31 abgeschlossenen Tagen, während -mmin Minuten verwendet.
  • Nebeneinanderstehende Prüfungen bedeuten UND, -o bedeutet 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 find für Dateieigenschaften und grep für Inhalte und kombiniere beide bei Bedarf.
  • Prüfe vor dem Löschen die Treffer und setze -delete danach hinter die einschränkenden Prüfungen.
  • locate durchsucht einen Index, der veraltet sein kann.
  • which findet ausführbare Dateien in PATH; type erklärt die Befehlsauflösung durch Bash.
6

Textdateien 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:

  1. Führe nano app.conf aus.
  2. Drücke Strg+W, gib „8080“ ein und drücke die Eingabetaste.
  3. Lösche am Treffer die vier Ziffern und gib „9090“ ein.
  4. Drücke Strg+O und dann die Eingabetaste, um den Dateinamen zu bestätigen und zu speichern.
  5. 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
TastenkombinationAktion
Strg+KDie gesamte aktuelle Zeile ausschneiden
Strg+UAusgeschnittenen Text am Cursor einfügen
Alt+AMarkierung eines Textbereichs beginnen
Alt+U / Alt+ERü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 und M- 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
ModusAufgabeSo wechselst du hinein
NormalmodusBewegen, löschen, kopieren und Befehle gebenEsc
EinfügemodusText in den Puffer eingebeni, a, o oder ein anderer Einfügebefehl
BefehlszeilenmodusBefehle 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, o und ihre großgeschriebenen Formen wählen, wo das Einfügen beginnt.
  • dd schneidet eine Zeile aus, yy kopiert sie und p fügt ganze Zeilen darunter oder zeichenweisen Text nach dem Cursor ein.
  • u macht rückgängig und . wiederholt die letzte Änderung.
  • /text sucht vorwärts; n wiederholt und N kehrt die Suchrichtung um.
  • :wq speichert und beendet; :q! verwirft ungespeicherte Änderungen und beendet.

Linux-Pipes und Textverarbeitung: Beispiele

6 Interaktive Lektionen

1

Eine Datei lesen, ohne die Orientierung zu verlieren

10 Schritte
Einen Anzeigebefehl wählen, in einem Pager navigieren und einen genauen Teil einer Datei auswählen.
  1. 1
    Einfü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 cat kennenzulernen, und wechsle dann zu less für eine Datei, die zu lang für den Bildschirm ist. Verwende schließlich head und tail, wenn du den benötigten Teil kennst. Diese Befehle lesen Text, ohne die gespeicherte Datei zu bearbeiten.

  2. 2
    BeispielZwei kurze Notizen zusammenfügen

    a.txt enthält „a“ und „b“ in getrennten Zeilen. b.txt enthält „c d“. Führe cat -n a.txt b.txt aus.

    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.txt aus.

  3. 3
    ErklärungEine Leseansicht öffnen

    Führe less /etc/services aus, 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, b zurück und die Pfeiltasten bewegen durch Zeilen. g springt zur ersten Zeile; G zur letzten. Drücke q, um die Ansicht zu schließen und zur Shell zurückzukehren. Eine fehlende Eingabeaufforderung der Shell ist normal, solange der Pager geöffnet ist.

  4. 4
    BeispielSuchen und fortsetzen

    Gib in less /ssh ein und drücke die Eingabetaste, um vorwärts nach „ssh“ zu suchen. Drücke n für den nächsten Treffer in dieser Richtung oder N, um in die entgegengesetzte Richtung zu gehen.

    Eine Rückwärtssuche beginnt mit ?ssh. Nach dieser Suche setzt n sie rückwärts fort. Die Richtung ergibt sich aus der Suche, die du gestartet hast. less -N file ergänzt Zeilennummern, wenn du die Position eines Treffers notieren möchtest.

  5. 5
    HerausforderungDen 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 dann q zum Beenden. Das kleingeschriebene n wü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.

  6. 6
    ErklärungEine Anzahl oder eine Startzeile wählen

    head -n 4 file gibt die ersten vier Zeilen aus. tail -n 4 file gibt die letzten vier aus. Ohne -n geben beide standardmäßig zehn Zeilen aus.

    Ein Pluszeichen ändert die Aufgabe von tail: tail -n +4 file beginnt bei Zeile 4 und gibt alles ab dort aus. Bei einer Datei mit einer Kopfzeile entfernt tail -n +2 file diese Kopfzeile. Der Befehl behält alle Datensätze, nicht nur die letzten zwei.

  7. 7
    BeispielDie 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.

  8. 8
    HerausforderungEinen 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.

  9. 9
    HerausforderungDen 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.log und drücke Strg+C, wenn du fertig bist. Das einfache tail würde das aktuelle Ende anzeigen und sich beenden. tail -F ist nützlich, wenn das Programm die Datei bei der Rotation ersetzt, weil es den Dateinamen beim Ersetzen weiterverfolgt.

  10. 10
    ZusammenfassungDie passende Ansicht für die Aufgabe verwenden

    Verwende für eine ganze kurze Datei cat; öffne zum Navigieren und Suchen less. Ein Pager bleibt geöffnet, bis du ihn beendest.

    Verwende head und tail fü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 mit tail -f und beende mit Strg+C. Dieselbe Auswahl funktioniert auch, wenn der Text durch eine Pipe ankommt.

2

Eingabe, Ergebnisse und Fehler nachverfolgen

11 Schritte
Dateien mit Standardströmen verbinden und die Reihenfolge der Shellumleitungen nachvollziehen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDrei getrennte Wege zeichnen
  2. 2
    ErklärungDie Standardströme benennen
  3. 3
    BeispielDieselben Daten über einen anderen Weg einspeisen
  4. 4
    HerausforderungDie Tastatureingabe abschließen
  5. 5
    BeispielMehrere Zeilen unter einem Befehl bereitstellen
  6. 6
    ErklärungErsetzen oder Anhängen wählen
  7. 7
    BeispielErgebnisse und Diagnosemeldungen zusammenführen
  8. 8
    HerausforderungDie Reihenfolge der Verbindungen umkehren
  9. 9
    TippDie Eingabe intakt halten
  10. 10
    HerausforderungEingabe zählen und eine Diagnosemeldung trennen
  11. 11
    ZusammenfassungDie Einrichtung durch die Shell nachvollziehen
3

Einen nützlichen Textbericht erstellen

14 Schritte
Eine Pipeline untersuchen, während sie eine Spalte auswählt, Werte gruppiert und zählt und Ergebnisse speichert.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungJeder Stufe eine Aufgabe geben
  2. 2
    ErklärungDie beiden Befehle verbinden
  3. 3
    HerausforderungEine Pipe oder eine Datei wählen
  4. 4
    ErklärungWissen, was der Zähler misst
  5. 5
    BeispielSortieren und Zählen unterscheiden
  6. 6
    HerausforderungEin verbleibendes Duplikat erklären
  7. 7
    ErklärungDie relevante Spalte auswählen
  8. 8
    BeispielDie Beschriftung entfernen und die Werte untersuchen
  9. 9
    HerausforderungEine Annahme über das Trennzeichen prüfen
  10. 10
    BeispielDie ausgewählten Werte gruppieren
  11. 11
    BeispielDie Anzahlen ordnen
  12. 12
    VerbindungEin Zwischenergebnis vor der abschließenden Zählung behalten
  13. 13
    HerausforderungEine zusätzliche Kategorie untersuchen
  14. 14
    ZusammenfassungPrüfen, was zwischen den Stufen übertragen wird
4

Muster für den gewünschten Text aufbauen

15 Schritte
grep-Optionen wählen und dann einfache und erweiterte Muster Operator für Operator aufbauen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEntscheiden, was als Treffer zählt
  2. 2
    ErklärungEine Suchausgabe wählen
  3. 3
    BeispielEin Wort von einer Zeile unterscheiden
  4. 4
    HerausforderungNach einer genauen Versionsbezeichnung suchen
  5. 5
    TippEin Verzeichnis durchsuchen oder eine Suche ohne Ausgabe durchführen
  6. 6
    ErklärungEinen Treffer innerhalb der Zeile positionieren
  7. 7
    BeispielEin Zeichen aus einer Menge auswählen
  8. 8
    KernaussageNull Vorkommen erlauben
  9. 9
    HerausforderungEine literale Dateinamenendung finden
  10. 10
    ErklärungErweiterte Operatoren einschalten
  11. 11
    BeispielEinen vollständigen Code prüfen
  12. 12
    BeispielEine Auswahl oder einen wiederholten Teil gruppieren
  13. 13
    HerausforderungTeile extrahieren und ihre Grenzen untersuchen
  14. 14
    HerausforderungNur aktive Einstellungen behalten
  15. 15
    ZusammenfassungMuster und Ausgabe getrennt prüfen
5

Dateien auswählen, bevor du sie bearbeitest

12 Schritte
Ein Startverzeichnis wählen, Dateiprüfungen anwenden und vollständige Pfade an den nächsten Befehl übergeben.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungNamen und Inhalte unterscheiden
  2. 2
    ErklärungDas Startverzeichnis wählen
  3. 3
    BeispielTyp und Name kombinieren
  4. 4
    HerausforderungDen Platzhalter für find erhalten
  5. 5
    ErklärungAufgerundete Größeneinheiten vergleichen
  6. 6
    HerausforderungDie Tagesschwelle richtig lesen
  7. 7
    ErklärungPfade als Argumente übergeben
  8. 8
    BeispielNur ausgewählte Inhalte durchsuchen
  9. 9
    TippEine destruktive Aktion hinter ihre Prüfungen setzen
  10. 10
    ErklärungEinen Index oder eine Befehlssuche wählen
  11. 11
    HerausforderungEine aktuelle Inhaltsprüfung wählen
  12. 12
    ZusammenfassungDie Suche auf die benötigten Informationen abstimmen
6

Eine kleine Änderung im Terminal vornehmen und speichern

13 Schritte
Eine Einstellung in nano und vi bearbeiten und dann entscheiden, ob die Änderungen im Puffer gespeichert oder verworfen werden.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungArbeitstext von gespeichertem Text unterscheiden
  2. 2
    ErklärungDie Bedienelemente von nano lesen
  3. 3
    BeispielEinen Wert finden und ersetzen
  4. 4
    HerausforderungEine Zeile verschieben und einen Fehler rückgängig machen
  5. 5
    TippMit der Nachfrage beim Beenden umgehen
  6. 6
    ErklärungIn den Einfügemodus von vi wechseln
  7. 7
    BeispielZum benötigten Text navigieren
  8. 8
    BeispielDie Einstellung in vi ändern
  9. 9
    HerausforderungDen kopierten Text passend zu seiner Art einfügen
  10. 10
    TippKleine Änderungen vornehmen und rückgängig machen
  11. 11
    HerausforderungEntscheiden, ob die Änderung in vi erhalten bleiben soll
  12. 12
    HerausforderungZwei ungespeicherte Änderungen vergleichen
  13. 13
    ZusammenfassungMit bewusstem Speichern oder Verwerfen abschließen

Linux-Pipes und Textverarbeitung: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Text lesen und seinen Weg verfolgen10 Übungsfragen

Frage 1 von 10

Du liest eine lange Datei in less. Welche einzelne Taste bringt dich zur Shell zurück?
  1. g
  2. h
  3. q
  4. n
Antwort zeigenAntwort ausblenden
Antwort: C
Drücke 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

Was gibt tail -n +3 records.txt aus?
  1. Jede Zeile ab Zeile 3.
  2. Nur die letzten drei Zeilen.
  3. Nur Zeile 3 der Datei.
  4. Jede Zeile vor Zeile 3.
Antwort zeigenAntwort ausblenden
Antwort: A
Das Pluszeichen macht 3 zu einer Startposition, sodass der Befehl Zeile 3 und alle folgenden Zeilen ausgibt. Ohne Pluszeichen würde 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

Die normalen Ergebnisse eines Befehls werden mit > report.txt gespeichert, seine Diagnosemeldungen bleiben aber sichtbar. Welcher Datenstrom transportiert diese Meldungen?
  1. Standardeingabe, Deskriptor 0.
  2. Standardausgabe, Deskriptor 1.
  3. Standardausgabe, Deskriptor 2.
  4. Standardfehlerausgabe, Deskriptor 2.
Antwort zeigenAntwort ausblenden
Antwort: D
Diagnosemeldungen laufen normalerweise über stderr mit der Nummer 2, getrennt von normalen Ergebnissen auf stdout mit der Nummer 1. Der Operator > 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

Du möchtest einen vorhandenen Bericht behalten und stdout eines Befehls an sein Ende anhängen. Welche Umleitung bewirkt das?
  1. > report.txt
  2. >> report.txt
  3. 2> report.txt
  4. < report.txt
Antwort zeigenAntwort ausblenden
Antwort: B
Der Operator >> 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

Ein Befehl gibt fünf normale Ergebniszeilen und zwei Diagnosezeilen aus. Welche Zeilenanzahl meldet command | wc -l?
  1. 7
  2. 2
  3. 5
  4. 0
Antwort zeigenAntwort ausblenden
Antwort: C
Die Pipe leitet die fünf stdout-Zeilen an 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

Eine Datei enthält „18“, „4“ und „105“, jeweils in einer eigenen Zeile. Welche Reihenfolge erzeugt sort -n?
  1. 105, 18, 4
  2. 18, 105, 4
  3. 4, 105, 18
  4. 4, 18, 105
Antwort zeigenAntwort ausblenden
Antwort: D
Die numerische Sortierung vergleicht die Werte, sodass 4 vor 18 und 105 steht. Eine einfache Textsortierung würde mit 105 beginnen, weil das erste Zeichen „1“ ist, und dann 18 vor 4 einordnen. Die Option -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?
  1. „4 clip“, dann „2 ring“.
  2. „4 clip“, dann „1 pad“.
  3. „4 ring“, dann „2 clip“.
  4. „1 clip“, dann „1 ring“.
Antwort zeigenAntwort ausblenden
Antwort: A
Die erste Sortierung gruppiert vier clip-Zeilen, zwei ring-Zeilen und eine pad-Zeile. uniq zählt diese Gruppen, dann ordnet die umgekehrte numerische Sortierung die Anzahlen und head behält die ersten zwei. Die einzelne pad-Zeile steht nicht an zweiter Stelle, weil die abschließende Reihenfolge der Häufigkeit und nicht der Textreihenfolge der Namen folgt.

Frage 8 von 10

Eine Datei enthält die Zeilen „FAIL“, „fail“, „failure“ und „all clear“. Wie viele Zeilen zählt grep -ic 'fail' file?
  1. 1
  2. 3
  3. 2
  4. 4
Antwort zeigenAntwort ausblenden
Antwort: B
Durch das Ignorieren der Groß- und Kleinschreibung passen sowohl „FAIL“ als auch „fail“, und grep findet dieselbe Zeichenfolge auch innerhalb von „failure“. Das ergibt drei passende Zeilen. Eine Anzahl von 2 würde eine Beschränkung auf ganze Wörter wie -w benötigen, die dieser Befehl nicht enthält.

Frage 9 von 10

Der Verzeichnisbaum enthält eine reguläre Datei 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?
  1. Nur docs/a.txt.
  2. docs/a.txt und docs/b.txt.
  3. docs/a.txt und docs/c.TXT.
  4. Alle drei Pfade unter docs.
Antwort zeigenAntwort ausblenden
Antwort: A
Beide Prüfungen müssen zutreffen: Der Eintrag muss eine reguläre Datei sein und sein Name muss unter Berücksichtigung der Groß- und Kleinschreibung auf die Endung passen. Nur 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

Du bist mit der Bearbeitung in nano fertig. Welche Tastenfolge speichert den aktuellen Puffer unter dem angezeigten Namen?
  1. Strg+R, dann Eingabetaste.
  2. Strg+K, dann Strg+U.
  3. Strg+O, dann Eingabetaste.
  4. Strg+X, dann N.
Antwort zeigenAntwort ausblenden
Antwort: C
Strg+O startet das Speichern und die Eingabetaste bestätigt den angezeigten Dateinamen, sodass der aktuelle Puffer auf den Datenträger geschrieben wird. Strg+R liest stattdessen Text einer anderen Datei in den Puffer. Strg+X gefolgt von N beendet ohne Speichern ungespeicherter Änderungen und würde damit die Arbeit verwerfen, die du behalten möchtest.
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

Was tut n nach einer Rückwärtssuche mit ?queue in less?
  1. Findet den nächsten Treffer vorwärts.
  2. Findet den nächsten Treffer rückwärts.
  3. Geht eine Bildschirmseite vorwärts.
  4. Geht zur ersten Zeile der Datei.
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?
  1. Sie lässt die Anzahl weg, behält aber den Dateinamen.
  2. Sie gibt eine andere Anzahl ohne Namen aus.
  3. Sie ergänzt nach derselben Anzahl eine Gesamtzeile.
  4. Sie lässt den Dateinamen weg, behält aber die Anzahl 8.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

In einem neu geöffneten Terminal schreibt ein Befehl Ergebnisse nach stdout und Diagnosemeldungen nach stderr. Wohin geht beides bei command 2>&1 > result.txt?
  1. Ergebnisse in die Datei; Diagnosemeldungen ans Terminal.
  2. Ergebnisse ans Terminal; Diagnosemeldungen in die Datei.
  3. Beide Datenströme in die Datei; keiner ans Terminal.
  4. Beide Datenströme ans Terminal; keiner in die Datei.
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?
  1. 2
  2. 4
  3. 3
  4. 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welcher Befehl durchsucht build.txt nach dem literalen Text „v3.8“, einschließlich des tatsächlichen Punktes?
  1. grep -F 'v3.8' build.txt
  2. grep -E 'v3.8' build.txt
  3. grep -i 'v3.8' build.txt
  4. grep -w 'v3.8' build.txt
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Die Zeilen lauten „dog“, „dig“, „drag“ und „undog“. Welche Zeilen passen auf grep '^d.g$' file?
  1. Alle außer „drag“.
  2. „dog“ und „dig“.
  3. Alle außer „undog“.
  4. Alle außer „dig“.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welche Zeilen aus „bt“, „bat“, „baat“ und „boat“ passen auf grep '^ba*t$' file?
  1. Nur „bat“ und „baat“.
  2. „bat“, „baat“ und „boat“.
  3. „bt“, „bat“ und „boat“.
  4. „bt“, „bat“ und „baat“.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein notes-Verzeichnisbaum enthält Dateinamen mit Leerzeichen. Du benötigst die Namen kürzlich geänderter .txt-Dateien, die „REVIEW“ enthalten. Welcher Befehl wendet alle drei Einschränkungen an?
  1. find notes -type f -name '*.txt' -mtime -7 | grep -l 'REVIEW'
  2. find notes -type f -name '*.md' -mtime -7 -exec grep -l 'REVIEW' {} +
  3. find notes -type f -name '*.txt' -mtime -7 -exec grep -l 'REVIEW' {} +
  4. find notes -type f -name '*.txt' -mtime +7 -exec grep -l 'REVIEW' {} +
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Taste bringt dich bei nanos Nachfrage „Save modified buffer?“ zur Bearbeitung zurück, ohne den Editor zu verlassen?
  1. N
  2. Strg+C
  3. Y
  4. Strg+O
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Im Normalmodus von vi kopierst du eine Zeile mit yy und drückst p. Wo erscheint die kopierte Zeile?
  1. Über der aktuellen Zeile.
  2. Nach dem Cursor innerhalb der Zeile.
  3. Vor dem Cursor innerhalb der Zeile.
  4. Unter der aktuellen 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

Eine Datei hat mindestens 28 Zeilen. Welcher Befehl zeigt genau die Zeilen 19 bis 28 an?
  1. head -n 28 file | tail -n 9
  2. head -n 19 file | tail -n 10
  3. head -n 28 file | tail -n +19 | head -n 9
  4. head -n 28 file | tail -n 10
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was geschieht mit vorhandenem Inhalt, bevor echo done > state.txt seine Ausgabe schreibt?
  1. Er bleibt vor der neuen Zeile am Ende erhalten.
  2. Er wird entfernt, wenn die Shell die Datei öffnet.
  3. Er gelangt nach stderr, bevor die neue Zeile geschrieben wird.
  4. Er bleibt, solange echo kein erfolgreiches Schreiben meldet.
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?
  1. Gibt 5 aus; speichert alle fünf ursprünglichen Zeilen.
  2. Gibt 3 aus; speichert nur die Anzahl selbst.
  3. Gibt 3 aus; speichert drei unterschiedliche Namen.
  4. Gibt 5 aus; speichert drei unterschiedliche Namen.
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?
  1. 2 a
  2. 3 a
  3. 2 b
  4. 1 b
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt cut -d: -f3,1 aus der Zeile „Nia:ops:42“ aus?
  1. „42:Nia“
  2. „Nia:42“
  3. „Nia:ops“
  4. „42:ops“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welche vollständigen Zeilen passen auf grep -E '^(go)+$' file?
  1. „go“ und „gogo“.
  2. „go“ und „goo“.
  3. „g“ und „go“.
  4. „go“ und „gog“.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Zeile enthält „node=7 node=24 node=301“. Welche Ausgabe erzeugt grep -Eo '[0-9]{1,2}' aus dieser Zeile?
  1. „7“ und „24“, in getrennten Zeilen.
  2. „7“, „24“, „301“, in getrennten Zeilen.
  3. „7“, „24“, „30“, „1“, in getrennten Zeilen.
  4. „7“, „2“, „4“, „3“, „0“, „1“, in getrennten Zeilen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welche der Größen 0 Byte, 1 Byte, 800.000 Byte und 1.048.576 Byte besteht die Prüfung -size -1M von GNU find?
  1. Bis zu 1 Byte.
  2. Alle unter 1 MiB.
  3. Alle vier Größen.
  4. Nur 0 Byte.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Warum könnte locate plan.txt einen Pfad anzeigen, der heute Morgen gelöscht wurde?
  1. Es liest gelöschte Dateiinhalte aus der Standardeingabe.
  2. Seine Namensprüfung ignoriert den aktuellen Zustand aller Verzeichnisse.
  3. Seine Pfaddatenbank berücksichtigt die Löschung noch nicht.
  4. Es durchsucht PATH, bevor es den angeforderten Namen prüft.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Du bist im Einfügemodus von vi und möchtest deine Änderungen behalten. Welche Folge speichert und beendet?
  1. Esc, :wq, Eingabetaste.
  2. Esc, :q!, Eingabetaste.
  3. Esc, :q, Eingabetaste.
  4. Esc, wq, Eingabetaste.
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

Du möchtest first.txt gefolgt von second.txt in joined.txt speichern, wobei die Ausgabezeilen über beide Eingabedateien hinweg fortlaufend nummeriert werden. Welcher Befehl tut das?
  1. cat -n first.txt second.txt > joined.txt
  2. cat first.txt second.txt > joined.txt
  3. cat -n second.txt first.txt > joined.txt
  4. cat -n first.txt second.txt | wc -l > joined.txt
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?
  1. 6
  2. 4
  3. 5
  4. 7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was signalisiert bei der interaktiven Eingabe von Zeilen in sort am Anfang einer leeren Zeile das Ende der Eingabe?
  1. Strg+C
  2. Strg+D
  3. Strg+O
  4. Strg+W
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Befehl gibt vier stdout-Zeilen und eine stderr-Zeile aus. Was erzeugt command 2>&1 | tee combined.txt | wc -l?
  1. Gibt 4 aus; speichert nur normale Ergebnisse.
  2. Gibt 5 aus; speichert nur die endgültige Anzahl.
  3. Gibt 4 aus; speichert Ergebnisse und Diagnosemeldungen.
  4. Gibt 5 aus; speichert Ergebnisse und Diagnosemeldungen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Die Eingabezeile lautet „A B C“, mit zwei Leerzeichen nach A. Was gibt cut -d' ' -f2 aus?
  1. „B“
  2. „C“
  3. Eine leere Zeile.
  4. „A“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Datei enthält „alert alert“, „prealert“, „Alert raised“ und „all clear“. Was meldet grep -icw 'alert' file?
  1. 2
  2. 1
  3. 3
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Liste enthält „x.cfg“, „xXcfg“, „x.cfg.old“ und „cfg“. Welches Muster wählt nur Zeilen aus, die mit der literalen Endung „.cfg“ enden?
  1. .cfg$
  2. \.cfg
  3. ^\.cfg$
  4. \.cfg$
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Verzeichnisbaum enthält die regulären Dateien „old.cfg“ (30,9 Tage alt), „notes.txt“ (31,1 Tage) und „runtime.cfg“ (31,1 Tage) sowie ein Verzeichnis „archive.cfg“ (31,1 Tage). Was wählt find . -type f -name '*.cfg' -mtime +30 aus?
  1. Beide „.cfg“-Dateien.
  2. Nur „runtime.cfg“.
  3. Jede 31,1 Tage alte Datei.
  4. Jeden 31,1 Tage alten „.cfg“-Eintrag.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Du hast in nano versehentlich eine Zeile ausgeschnitten und möchtest sie durch Umkehren dieser Aktion wiederherstellen. Welche Tastenkombination tut das?
  1. Alt+U
  2. Strg+U
  3. Strg+K
  4. Alt+A
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Zeile in vi beginnt mit vier Leerzeichen vor „enabled=yes“. Wo beginnt I vom Normalmodus aus mit dem Einfügen?
  1. Vor allen vier Leerzeichen, in Spalte eins.
  2. Vor „enabled“, nach den vier Leerzeichen.
  3. Nach „enabled=yes“, am Ende der Zeile.
  4. In einer neuen leeren Zeile über der Einstellung.
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

Eine Datendatei hat eine einzeilige Kopfzeile, gefolgt von 30 Datensätzen. Welcher Befehl zeigt nach dem Entfernen der Kopfzeile die ursprünglichen Dateizeilen 14 bis 18 an?
  1. tail -n +2 file | head -n 18 | tail -n 5
  2. tail -n +2 file | head -n 17 | tail -n 4
  3. tail -n +2 file | head -n 17 | tail -n 5
  4. tail -n +2 file | head -n 14 | tail -n 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Befehl schreibt zwei normale Zeilen und eine Diagnosezeile. Sowohl log.txt als auch err.txt enthalten bereits älteren Text. Was geschieht bei command >> log.txt 2> err.txt?
  1. Normale Zeilen ersetzen log; die Diagnose wird an err angehängt.
  2. Normale Zeilen werden an log angehängt; die Diagnose ersetzt err.
  3. Beide Datenströme werden an log angehängt; err behält den älteren Text.
  4. Normale Zeilen werden an err angehängt; die Diagnose ersetzt log.
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?
  1. tail -n +2 sizes.csv | sort -t, -k2,2r | head -n 2
  2. tail -n +2 sizes.csv | sort -t, -k2,2n | head -n 2
  3. tail -n +2 sizes.csv | sort -t, -k1,1nr | head -n 2
  4. tail -n +2 sizes.csv | sort -t, -k2,2nr | head -n 2
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?
  1. 3 North
  2. 1 North
  3. 2 North
  4. 1 zone
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Kurzoption lässt grep bei passenden Zeilen die Nummern der Eingabezeilen anzeigen?
  1. -c
  2. -n
  3. -l
  4. -o
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welche Zeile aus „rad“, „red“, „rid“ und „road“ passt auf grep '^r[^ae]d$' file?
  1. „rad“
  2. „red“
  3. „rid“
  4. „road“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Konfigurationsdatei enthält „ # memo“, drei Leerzeichen, „mode=fast“ und „x#y=on“, jeweils als eigene Zeile. Was bleibt bei grep -Ev '^[[:space:]]*(#|$)' file erhalten?
  1. „mode=fast“ und „x#y=on“.
  2. Nur „mode=fast“.
  3. „ # memo“ und „mode=fast“.
  4. Drei Leerzeichen und „x#y=on“.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Du möchtest wissen, wie Bash einen Befehl interpretiert, einschließlich eines möglichen Alias oder eingebauten Befehls. Welchen Befehl solltest du für den Namen echo verwenden?
  1. which echo
  2. locate echo
  3. find . -name echo
  4. type echo
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Im Normalmodus von vi löscht x ein Zeichen. Danach drückst du p. Wo wird dieses Zeichen eingefügt?
  1. Vor dem Cursor.
  2. Unter der aktuellen Zeile.
  3. Nach dem Cursor.
  4. Über der aktuellen Zeile.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Du benötigst reguläre Dateien unmittelbar in work, ohne Dateien aus tieferen Verzeichnissen. Welche Suche leistet das?
  1. find work -maxdepth 1 -type d
  2. find work -maxdepth 1 -type f
  3. find work -maxdepth 2 -type f
  4. find work -maxdepth 0 -type f
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

72 Schlüsselbegriffe, jeweils mit Definition

A

Abschneiden
Beim Abschneiden wird eine vorhandene Ausgabedatei geleert, wenn die Shell sie für eine gewöhnliche >-Umleitung öffnet, bevor der Befehl Eingaben zu lesen beginnt.
Der Befehl sort names.txt > names.txt verliert die ursprünglichen Daten, weil das Abschneiden zuerst geschieht.
Alternation
Alternation drückt in der erweiterten Syntax eine Auswahl zwischen Mustern regulärer Ausdrücke mit | aus, häufig mit runden Klammern zur Begrenzung des Geltungsbereichs der Auswahl.
In ^(east|west)$ müssen beide Alternativen die ganze Zeile ausfüllen, weil sie dieselben Anker verwenden.
Anhängen
Anhängen bedeutet, Ausgabe am Ende einer Datei hinzuzufügen und dabei ihren vorhandenen Inhalt zu erhalten; für die Standardausgabe eines Befehls wird dazu >> verwendet.
Wiederholte Befehle mit >> report.txt sammeln ihre Ergebnisse in einer Datei, statt sie zu ersetzen.
Anker
Ein Anker beschränkt einen Treffer eines regulären Ausdrucks auf eine Position, etwa ^ auf den Anfang oder $ auf das Ende einer Zeile bei gewöhnlichen grep-Suchen.
Wenn du d.g beide Anker hinzufügst, wird eine längere Zeile wie „undog“ ausgeschlossen, obwohl sie „dog“ enthält.

Ä

Änderungszeitpunkt
Der Änderungszeitpunkt hält fest, wann Dateiinhalte zuletzt geändert wurden; -mtime von find prüft das seitdem vergangene Alter in abgeschlossenen Zeiträumen von 24 Stunden.
Eine Datei, die vor 30,5 Tagen geändert wurde, besteht -mtime +30 nicht, weil erst 30 vollständige Tageszeiträume vergangen sind.

B

Befehlszeilenmodus
Der Befehlszeilenmodus nimmt einen Befehl in der untersten Zeile von vi entgegen, nachdem im Normalmodus : eingegeben wurde, und führt ihn beim Drücken der Eingabetaste aus.
Der Befehl :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.
Der Aufruf 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.
Der Befehl cut -d: -f1,6 /etc/passwd stellt jeden Kontonamen seinem Home-Verzeichnisfeld gegenüber.

D

Dateideskriptor
Ein Dateideskriptor ist eine Nummer, die eine offene Ein- oder Ausgabeverbindung bezeichnet, darunter 0 für stdin, 1 für stdout und 2 für stderr.
Die 2 in 2> errors.txt wählt den Fehlerstrom und muss direkt am Umleitungsoperator stehen.
Dateitypprüfung
Eine Dateitypprüfung beschränkt eine Dateisuche auf eine Art von Eintrag und verwendet Kennungen wie f für eine reguläre Datei, d für ein Verzeichnis oder l für einen Link.
Ein zusätzliches -type f verhindert, dass ein Verzeichnis namens „old.txt“ bei einer Suche nach Textdateien ausgewählt wird.
Deskriptorduplizierung
Die Deskriptorduplizierung verbindet einen nummerierten Datenstrom mit dem aktuellen Ziel eines anderen Datenstroms, wie 2>&1 es für stderr und stdout tut.
In command > all.txt 2>&1 erhält stderr die Dateiverbindung, die stdout bereits hat.

E

Einfügemodus
Im Einfügemodus werden eingegebene Zeichen zu Text im Puffer von vi. Er wird durch Befehle wie i, a oder o gestartet und mit Esc beendet.
Nachdem cw den Rest eines Wortes entfernt hat, gib den Ersatz im Einfügemodus ein und drücke dann Esc.
Ersetzung
Eine Ersetzung tauscht passenden Text über die Befehlszeile von vi aus. Dabei wählt ein Bereich die Zeilen und Optionen steuern die Ersetzung innerhalb dieser Zeilen.
Der Befehl :%s/old/new/g ersetzt jedes passende „old“ in jeder Zeile der Datei.
Erweiterter regulärer Ausdruck
Ein erweiterter regulärer Ausdruck gibt Operatoren wie ?, +, |, geschweiften und runden Klammern ihre besonderen Bedeutungen ohne umgekehrte Schrägstriche.
Verwende grep -E vor einem gruppierten Muster wie ^(red|blue)$, um die Alternative zu aktivieren.
Extraktion von Treffern
Die Extraktion von Treffern gibt passende Textteile statt ganzer Eingabezeilen aus, wie es die Option -o von grep für jeden nicht leeren Treffer tut.
Enthält eine Zeile „id=42 id=57“, gibt grep -Eo '[0-9]+' die beiden Zahlen in getrennten Zeilen aus.

F

Feld
Ein Feld ist ein Teil eines durch Trennzeichen gegliederten Datensatzes. cut nummeriert Felder ab 1 und wählt sie anhand des Trennzeichens im Datensatz aus.
In „Lena,Oslo,74“ ist Feld 2 „Oslo“, wenn ein Komma als Trennzeichen für die Zeile gewählt wird.
Filter
Ein Filter liest Daten aus der Standardeingabe, wählt sie aus oder verändert sie und schreibt ein Ergebnis auf die Standardausgabe, sodass er in einer Pipeline arbeiten kann.
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.
Die Aktion -exec wc -l {} + übergibt mehrere passende Pfade gesammelt an einen Befehl, der ihre Zeilen zählt.

G

Ganzworttreffer
Ein Ganzworttreffer verlangt, dass der passende Text ein vollständiges Wort bildet, wobei andere Wörter weiterhin in derselben Zeile stehen dürfen.
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.
Verwende grep -n WARN app.log, um passende Zeilen zusammen mit ihren Positionen in der Datei anzuzeigen.
Gruppe
Eine Gruppe in einem regulären Ausdruck setzt eine Folge in runde Klammern, sodass ein Operator auf sie als ein Element wirken kann oder Alternativen denselben umgebenden Text teilen können.
Der Ausdruck (ab)+ erlaubt „ab“ und „abab“, weil das Plus die vollständige Gruppe aus zwei Zeichen wiederholt.

H

Häufigkeitszählung
Eine Häufigkeitszählung meldet, wie oft jeder Wert vorkommt. Sie wird häufig erstellt, indem gleiche Zeilen mit sort gruppiert und Folgen mit uniq -c gezählt werden.
Füge 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.
Untersuche den Dateianfang mit head -n 4 notes.txt, bevor du entscheidest, ob du die ganze Datei benötigst.
Here-Dokument
Ein Here-Dokument stellt mehrere Zeilen als Standardeingabe bereit und endet, wenn die Shell eine Zeile erreicht, die nur das gewählte Trennzeichen enthält.
Bei cat <<EOF sind die vor dem abschließenden EOF eingegebenen Zeilen Daten, während diese letzte Zeile eine Markierung ist.
Here-String
Ein Here-String ist eine Bash-Eingabeumleitung, die einem Befehl über die Standardeingabe eine einzelne Zeichenkette mit anschließendem Zeilenvorschub bereitstellt.
Der Befehl wc -w <<< "red blue green" erhält drei Wörter, ohne eine separate Eingabedatei zu benötigen.

K

Klammerausdruck
Ein Klammerausdruck wählt ein Zeichen aus einer Menge oder einem Bereich aus; ein Zirkumflex am Anfang innerhalb der Menge kehrt um, welche Zeichen passen.
Das Muster b[ae]t passt auf „bat“ oder „bet“, während b[^a]t „a“ an der mittleren Position ausschließt.
Kopieren (Yank)
Kopieren bedeutet in vi, Text zum späteren Einfügen zu übernehmen, wie yy es für eine ganze Zeile tut, ohne diese Zeile aus dem Arbeitspuffer zu entfernen.
Verwende yy gefolgt von p, um eine Zeile unter ihrer ursprünglichen Position in der Datei zu duplizieren.

L

Leeres Feld
Ein leeres Feld enthält keine Zeichen zwischen seinen Trennzeichen, sodass aufeinanderfolgende Trennzeichen ein Feld erzeugen können, das wie ein fehlender Wert aussieht.
Mit einem Leerzeichen als Trennzeichen hat „a b“ ein leeres zweites Feld zwischen seinen beiden Leerzeichen.
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.
Verwende 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.
Eine neu erstellte Notiz kann in den Ergebnissen von locate fehlen, bis die Pfaddatenbank aktualisiert wird.

M

Markierter Textbereich
Ein markierter Textbereich ist Text zwischen einer Anfangsmarkierung und dem Cursor. So kann nano den ausgewählten Teil statt einer ganzen Zeile ausschneiden.
Drücke Alt+A, um die Markierung zu beginnen, bewege dich zum anderen Ende und schneide den ausgewählten Text dann mit Strg+K aus.
Maskierung
Maskierung verwendet einen umgekehrten Schrägstrich, um zu ändern, wie ein Sonderzeichen gelesen wird, etwa damit ein Punkt in einem regulären Ausdruck auf einen tatsächlichen Punkt statt auf ein beliebiges Zeichen passt.
Das Muster \.txt$ verlangt eine literale Endung „.txt“, während .txt$ ein anderes Zeichen vor „txt“ erlaubt.
Metazeichen
Ein Metazeichen hat eine besondere Bedeutung in einem Muster, etwa der Punkt für ein Zeichen oder der Stern für die Wiederholung des vorhergehenden Elements in einem regulären Ausdruck.
Anführungszeichen schützen * vor der Shell, aber grep interpretiert es weiterhin als Operator eines regulären Ausdrucks, wenn es das Zeichen erhält.
Modaler Editor
Ein modaler Editor weist denselben Tasten in verschiedenen Modi unterschiedliche Bedeutungen zu und trennt die Texteingabe von Befehlen zum Bewegen und Bearbeiten.
In vi löscht das Drücken von „x“ im Normalmodus ein Zeichen, während es im Einfügemodus ein „x“ schreibt.

N

Namensprüfung
Eine Namensprüfung vergleicht den gesamten Namen eines Eintrags mit einem Platzhaltermuster; -name von find unterscheidet zwischen Groß- und Kleinschreibung, während -iname sie ignoriert.
Die Prüfung -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.
Öffne nano +12 app.conf, wenn ein Programm meldet, dass eine Einstellung in Zeile 12 überprüft werden muss.
noclobber
noclobber ist eine Bash-Einstellung, die gewöhnliche >-Umleitungen auf vorhandene reguläre Dateien verhindert und so vor versehentlichem Ersetzen schützt.
Verwende nach set -o noclobber >| nur, wenn du den Schutz vorhandener Dateien absichtlich außer Kraft setzen möchtest.
Normalmodus
Der Normalmodus ist der Befehlszustand von vi, in dem Tasten den Cursor bewegen oder Text bearbeiten. Esc stellt diesen Zustand vor einem weiteren Befehl her.
Drücke Esc und dann dd, um die aktuelle Zeile auszuschneiden, ohne versehentlich diese beiden Buchstaben einzugeben.
Nullgerät
Das Nullgerät /dev/null ist eine spezielle Datei, die geschriebene Daten verwirft, sodass ein ausgewählter Ausgabestrom bewusst ausgeblendet werden kann.
Ein zusätzliches 2>/dev/null blendet Diagnosemeldungen einer Dateisuche aus, einschließlich Meldungen über unlesbare Verzeichnisse.
Numerische Sortierung
Eine numerische Sortierung vergleicht die Zahlenwerte von Textfeldern, sodass Werte wie 9 und 100 nach ihrer Größe statt nach der ersten Ziffer geordnet werden.
Verwende sort -n, um „9“ vor „100“ zu setzen, wenn die Zeilen Mengen statt Bezeichnungen darstellen.

P

Pager
Ein Pager ist ein Programm, das Text bildschirmweise anzeigt und auf Navigationstasten wartet, sodass du lange Ausgaben in deinem eigenen Tempo lesen kannst.
Öffne eine lange Liste mit 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
Eine Pipe verbindet die Standardausgabe eines Befehls mit der Standardeingabe eines anderen und überträgt Daten ohne eine gespeicherte Zwischendatei.
In grep -i error app.log | wc -l fließen ausgewählte Zeilen in den Befehl, der sie zählt.
Pipeline
Eine Pipeline ist eine Reihe durch Pipes verbundener Befehle, in der jede Stufe Daten von der unmittelbar vorhergehenden Stufe erhält.
In sort values.txt | uniq | wc -l misst die abschließende Zählung die Anzahl unterschiedlicher gruppierter Werte.
Puffer
Ein Puffer ist die Arbeitskopie eines Textes im Speicher eines Editors. Sie kann Änderungen enthalten, die noch nicht in die Datei auf dem Datenträger geschrieben wurden.
Meldet nano beim Speichern einen Berechtigungsfehler, kann sich der bearbeitete Puffer von der gespeicherten Datei unterscheiden.

Q

Quantifizierer
Ein Quantifizierer legt fest, wie oft das vorhergehende Element eines regulären Ausdrucks vorkommen darf, etwa ? für optionalen Text oder {4} für genau vier Wiederholungen.
Der Ausdruck [0-9]{4} verlangt vier Ziffern; Anker können festlegen, dass diese den gesamten Zeileninhalt bilden.

R

Regulärer Ausdruck
Ein regulärer Ausdruck ist ein Muster, das passenden Text durch literale Zeichen und Operatoren für Positionen, Auswahlmöglichkeiten oder Wiederholungen beschreibt.
Das Muster ^web[0-9]$ beschreibt eine ganze Zeile, die „web“ gefolgt von einer Ziffer enthält.
Rekursive Suche
Eine rekursive Suche besucht ein Verzeichnis und seine Unterverzeichnisse; 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
Ein Rückgabestatus ist eine Zahl, die ein Befehl an die Shell zurückgibt, etwa die bei grep übliche 0 für einen Treffer, 1 für keinen Treffer oder 2 für einen Fehler.
Eine Suche ohne Ausgabe mit grep -q meldet ihr Ergebnis über den Status, ohne passende Zeilen auszugeben.

S

Sortierschlüssel
Ein Sortierschlüssel ist das Feld oder der Teil einer Zeile, der zum Vergleich dient. Er wird mit sort -k ausgewählt und anhand des gewählten Trennzeichens bestimmt.
Der Schlüssel -k3,3nr vergleicht bei einer Rangfolge von Punktzahlen nur Feld 3, numerisch und in umgekehrter Reihenfolge.
Speichern (Write Out)
Speichern ist die Speicheraktion von nano. Sie wird mit Strg+O gestartet und durch Bestätigen des Zieldateinamens, normalerweise mit der Eingabetaste, abgeschlossen.
Verwende nach dem Ändern einer Einstellung die Speicheraktion vor dem Beenden, wenn der neue Text auf dem Datenträger erhalten bleiben soll.
Standardausgabe
Die Standardausgabe ist der normale Ergebnisstrom eines Befehls mit der Nummer 1, der an das Terminal, eine Ausgabedatei oder einen anderen Befehl gehen kann.
In wc -l < names.txt > count.txt gelangt die Zeilenanzahl über die Standardausgabe in die Berichtsdatei.
Standardeingabe
Die Standardeingabe ist der eingehende Datenstrom eines Befehls mit der Nummer 0, den die Shell mit der Tastatur, einer Datei oder einer Pipe verbinden kann.
In sort < names.txt verbindet die Shell die Datei vor der Ausführung mit der Standardeingabe des Befehls.
Standardfehlerausgabe
Die Standardfehlerausgabe ist der Diagnosestrom mit der Nummer 2. Er ist von normalen Ergebnissen getrennt, sodass Fehler und Statusmeldungen unabhängig umgeleitet werden können.
Wenn du eine Verzeichnisauflistung mit > speicherst, kann eine Meldung über einen fehlenden Pfad auf der Standardfehlerausgabe sichtbar bleiben.
Suche nach festen Zeichenfolgen
Eine Suche nach festen Zeichenfolgen behandelt Musterzeichen als literalen Text, sodass Punkte und Sterne ihre Bedeutung als Zeichen regulärer Ausdrücke verlieren, wenn grep -F verwendet.
Verwende grep -F "v2.4" releases.txt, um den tatsächlichen Punkt in der Versionsbezeichnung zu verlangen.
Suchtiefe
Die Suchtiefe misst Ebenen unterhalb eines Startpfads; -maxdepth von find begrenzt, wie weit die Traversierung in Unterverzeichnisse hinabsteigen darf.
Verwende -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.
Verwende 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.
Füge tee selected.txt vor einer Zählstufe ein, wenn du die ausgewählten Zeilen auch untersuchen möchtest.
Text mit fester Feldbreite
Text mit fester Feldbreite platziert Informationen in jeder Zeile an gleichbleibenden Zeichenpositionen, sodass eine Auswahl nach Position statt einer Aufteilung an Trennzeichen möglich ist.
Ein Code aus fünf Zeichen am Anfang jeder Zeile kann mit cut -c1-5 ausgewählt werden, selbst wenn späterer Text variiert.
Traversierung
Eine Traversierung besucht Einträge in einem Verzeichnisbaum und durchläuft dabei nach Bedarf Unterverzeichnisse; die Traversierungsreihenfolge von find muss nicht alphabetisch sein.
Hänge | sort an eine einfache Pfadsuche an, wenn die Reihenfolge ihrer ausgegebenen Ergebnisse vorhersehbar sein soll.
Trennzeichen
Ein Trennzeichen trennt Felder voneinander, etwa ein Doppelpunkt, Komma oder Tabulator; cut -d wählt das Zeichen, an dem jede Zeile aufgeteilt wird.
Beim Datensatz „Mia:ops:41“ macht ein Doppelpunkt als Trennzeichen „ops“ unabhängig von der Wortlänge zu Feld 2.
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
Eine Umleitung ist eine Shelloperation, die ändert, woher ein Befehl Eingaben liest oder wohin er Ausgaben sendet, und die Verbindungen vor der Ausführung einrichtet.
In 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.
Wenn du verstreute Werte vor 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.
Ein Administrator kann sudo updatedb ausführen, wenn eine sofortige systemweite Aktualisierung sinnvoll ist.

V

Verfolgungsmodus
Im Verfolgungsmodus wartet tail nach seiner anfänglichen Ausgabe auf angehängte Daten, sodass neuer Text erscheinen kann, während ein Programm in die Datei schreibt.
Führe während einer Anwendungsprüfung tail -f app.log aus und drücke Strg+C, wenn du mit dem Beobachten fertig bist.
Verkettung
Verkettung fügt Textfolgen in einer Reihenfolge zusammen, etwa indem die Inhalte mehrerer Dateien mit cat nacheinander ausgegeben werden.
Bei 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.
Vergleiche bei UTF-8-Text wie „café“ wc -c mit wc -m, um Bytes von Zeichen zu unterscheiden.

Z

Zeichenklasse
Eine Zeichenklasse ist eine benannte Gruppe wie Ziffern, Buchstaben oder Leerraum. Sie wird innerhalb eines Klammerausdrucks verwendet und richtet sich nach den Spracheinstellungen.
Der vollständige Ausdruck [[:digit:]] wählt eine Ziffer aus; beide Paare eckiger Klammern sind nötig.
Zeilenbereich
Ein Zeilenbereich ist eine zusammenhängende Auswahl nummerierter Zeilen mit einer Anfangs- und einer Endposition, die normalerweise beide Endpunkte einschließt.
Um die Zeilen 11–20 anzuzeigen, behalte mit head die ersten 20 Zeilen und dann die letzten zehn dieser Auswahl.
Zeilenvorschub
Ein Zeilenvorschub markiert das Ende einer Textzeile; wc -l zählt diese Markierungen, sodass eine nicht abgeschlossene letzte Zeile die gemeldete Gesamtzahl nicht erhöht.
Text mit „one“, einem Zeilenvorschub und danach „two“ ergibt die Zeilenvorschubanzahl 1, wenn keine abschließende Markierung folgt.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten