Einführung
In diesem Lab werden wir leistungsstarke Techniken der Textverarbeitung unter Linux untersuchen, wobei der Schwerpunkt auf regulären Ausdrücken liegt. Wir werden verschiedene Befehle verwenden, um Texte zu suchen, zu filtern und zu manipulieren. Dies vermittelt Ihnen grundlegende Fähigkeiten für die Arbeit mit Textdaten in Unix-ähnlichen Betriebssystemen. Egal, ob Sie Anfänger sind oder Ihre Kenntnisse vertiefen möchten, dieses Lab bietet Ihnen ein solides Fundament in der Textverarbeitung und im Umgang mit regulären Ausdrücken.
Reguläre Ausdrücke mit Grep verstehen
Reguläre Ausdrücke (Regex) sind Muster, die verwendet werden, um Zeichenkombinationen in Zeichenketten zu finden. Sie sind grundlegend für viele Textverarbeitungsaufgaben unter Linux. Wir beginnen mit der Verwendung von grep und einfachen regulären Ausdrücken.
Zuerst erstellen wir eine einfache Textdatei zum Üben:
cd ~/project
echo -e "labex\nexlab\nlab*\nLABEX\nLab" > practice.txt
Dieser Befehl erstellt eine Datei namens practice.txt in Ihrem aktuellen Verzeichnis mit fünf Textzeilen. Die Option -e ermöglicht es uns, Escape-Zeichen wie \n für Zeilenumbrüche zu verwenden.
Nun verwenden wir grep mit einem einfachen regulären Ausdruck:
grep "lab" practice.txt
Sie sollten Folgendes sehen:
labex
exlab
lab*
Dieser Befehl findet alle Zeilen, die "lab" enthalten. Beachten Sie, dass die Suche case-sensitive (groß-/kleinschreibungssensitiv) ist, weshalb "LABEX" und "Lab" nicht in der Ausgabe enthalten sind.
Versuchen wir einen spezifischeren Regex:
grep "^lab" practice.txt
Sie sollten Folgendes sehen:
labex
lab*
Das Symbol ^ steht für den Zeilenanfang. Daher findet dieser Befehl nur Zeilen, die mit "lab" beginnen.
Lassen Sie uns nun die Suche unabhängig von der Groß- und Kleinschreibung machen:
grep -i "lab" practice.txt
Dies sollte alle fünf Zeilen in der Datei finden.
Erläuterung:
grepist der Befehl, den wir zum Suchen nach Mustern verwenden.- Das gesuchte Muster wird in Anführungszeichen gesetzt.
practice.txtist die Datei, in der gesucht wird.- Die Option
-iignoriert die Groß- und Kleinschreibung.
Fortgeschrittene Grep-Nutzung
Lassen Sie uns einige fortgeschrittenere Funktionen von grep erkunden, die Ihre Textsuche leistungsfähiger und effizienter machen können.
Zeilennummern anzeigen:
grep -n "lab" practice.txtDies zeigt die Zeilennummern der Treffer an. Die Option
-nweistgrepan, jeder Ausgabezeile die entsprechende Zeilennummer aus der Textdatei voranzustellen.Zeilen vor und nach dem Treffer anzeigen:
grep -C 1 "exlab" practice.txtDie Option
-C 1zeigt eine Kontextzeile vor und nach der passenden Zeile an. Sie können die Zahl anpassen, um mehr oder weniger Kontextzeilen anzuzeigen.Die Suche umkehren:
grep -v "lab" practice.txtDie Option
-vinvertiert die Suche und zeigt Zeilen an, die das Muster nicht enthalten. Dies ist nützlich, wenn Sie bestimmte Muster aus Ihren Ergebnissen ausschließen möchten.Verwendung von regulären Ausdrücken:
grep "lab[ex]*" practice.txtDieser Regex findet "lab", gefolgt von einer beliebigen Anzahl der Zeichen "e" oder "x". Dies demonstriert, wie Sie komplexere Muster in Ihren Suchanfragen verwenden können.
Erläuterung:
- Die Option
-nstellt jeder Ausgabezeile ihre Zeilennummer aus der Datei voran. -C 1zeigt eine Zeile Kontext vor und nach dem Treffer, was hilft, den Zusammenhang zu verstehen.-vkehrt die Suche um und zeigt Zeilen, die nicht auf das Muster passen.[ex]*ist ein Regex, der auf null oder mehr Vorkommen von entweder 'e' oder 'x' passt.
Probieren Sie diese Befehle aus und beobachten Sie die Ergebnisse. Das Verständnis dieser Optionen wird Ihre Fähigkeit, Texte effektiv zu durchsuchen und zu filtern, erheblich verbessern.
Einführung in Sed
sed (Stream Editor) ist ein leistungsstarkes Werkzeug zum Parsen und Transformieren von Text. Es wird häufig verwendet, um automatisierte Bearbeitungen an Dateien oder Ausgabeströmen vorzunehmen. Beginnen wir mit einigen grundlegenden sed-Operationen.
Die Sed-Syntax verstehen
Bevor wir uns Beispielen zuwenden, ist es wichtig, die grundlegende Syntax von sed-Befehlen zu verstehen, insbesondere die Verwendung von Trennzeichen (Delimitern) und Sonderzeichen.
Struktur des Sed-Befehls
Die Grundstruktur eines sed-Ersetzungsbefehls lautet:
sed 's/pattern/replacement/flags' filename
Aufschlüsselung der Syntax:
s= Substitutions-Befehl (ersetzen)/= Trennzeichen (trennt Muster, Ersatz und Flags)pattern= Wonach gesucht werden sollreplacement= Womit es ersetzt werden sollflags= Optionen wieg(global) oderi(case-insensitive)
Trennzeichen verstehen: Schrägstrich (/) vs. Backslash ()
Schrägstriche (/) als Trennzeichen:
- Werden verwendet, um die verschiedenen Teile des Ersetzungsbefehls zu trennen.
- Format:
s/Suche/Ersatz/Flags - Die
/-Zeichen sind kein Teil des Suchmusters oder des Ersatztextes. - Beispiel:
s/Hello/Hi/gbedeutet "ersetze Hello global durch Hi".
Backslashes () zum Maskieren:
- Werden verwendet, um Sonderzeichen zu maskieren (escapen) oder eine wörtliche Interpretation anzuzeigen.
- Werden bei Befehlen wie
i\(Einfügen) unda\(Anhängen) verwendet. - Beispiel:
1i\First linebedeutet "füge 'First line' vor Zeile 1 ein".
Hauptunterschied:
/= Trennsymbole zwischen Befehlsteilen.\= Escape-Zeichen oder Befehls-Abschlusszeichen.
Erstellen Sie zuerst eine neue Datei, mit der wir arbeiten können:
echo -e "Hello, world\nThis is a test\nHello, labex\nWorld of Linux" > sed_test.txt
Dies erstellt eine Datei namens sed_test.txt in Ihrem aktuellen Verzeichnis mit vier Textzeilen.
Nun verwenden wir sed, um Text zu ersetzen:
sed 's/Hello/Hi/' sed_test.txt
Aufschlüsselung dieses Befehls:
s= Substitutions-Befehl- Erster
/= Startet das Suchmuster Hello= Der zu suchende Text- Zweiter
/= Trennt Suchmuster vom Ersatztext Hi= Der Ersatztext- Dritter
/= Beendet den Ersatz (keine Flags folgen)
Dieser Befehl ersetzt das erste Vorkommen von "Hello" durch "Hi" in jeder Zeile. Standardmäßig ersetzt sed nur den ersten Treffer pro Zeile.
Hinweis: Da "Hello" in diesem Beispiel nur einmal pro Zeile vorkommt, sieht es so aus, als würden alle Instanzen auch ohne das g-Flag ersetzt.
Um den Effekt des g-Flags besser zu verstehen, ändern wir sed_test.txt so, dass mehrere Vorkommen von "Hello" in derselben Zeile stehen:
echo -e "Hello, world. Hello everyone\nThis is a test\nHello, labex says Hello\nWorld of Linux" > sed_test.txt
Der Inhalt von sed_test.txt ist nun:
Hello, world. Hello everyone
This is a test
Hello, labex says Hello
World of Linux
Führen Sie den Ersetzungsbefehl erneut ohne das g-Flag aus:
sed 's/Hello/Hi/' sed_test.txt
Die Ausgabe wird sein:
Hi, world. Hello everyone
This is a test
Hi, labex says Hello
World of Linux
Sie sehen, dass nur das erste "Hello" in jeder Zeile ersetzt wurde.
Führen Sie nun eine globale Ersetzung mit dem g-Flag durch:
sed 's/Hello/Hi/g' sed_test.txt
Die Ausgabe wird sein:
Hi, world. Hi everyone
This is a test
Hi, labex says Hi
World of Linux
Diesmal wurden alle Vorkommen von "Hello" in jeder Zeile durch "Hi" ersetzt.
Detaillierte Erläuterung:
sed 's/Hello/Hi/': Ersetzt das erste gefundene "Hello" in jeder Zeile.- Struktur:
s(ersetzen) +/Hello/(Suchmuster) +Hi/(Ersatz) - Die drei
/-Zeichen sind Trennzeichen, kein Teil des Textes.
- Struktur:
sed 's/Hello/Hi/g': Ersetzt alle gefundenen "Hello" in jeder Zeile.- Struktur:
s(ersetzen) +/Hello/(Suchmuster) +Hi/(Ersatz) +g(globales Flag) - Das
g-Flag steht für "global" und gibt an, dass die Ersetzung für jedes Vorkommen in der Zeile vorgenommen werden soll.
- Struktur:
Alternative Verwendung von Trennzeichen: Sie können andere Zeichen als Trennzeichen verwenden, wenn Ihr Text Schrägstriche enthält. Zum Beispiel:
sed 's#/path/to/file#/new/path#g' filename
Hier wird # anstelle von / als Trennzeichen verwendet, was bei der Arbeit mit Dateipfaden sehr nützlich ist.
Beachten Sie, dass diese Befehle die Datei selbst nicht verändern; sie geben lediglich den modifizierten Text im Terminal aus. Um die Datei direkt zu bearbeiten, verwenden Sie die Option -i:
sed -i 's/Hello/Hi/g' sed_test.txt
Überprüfen Sie nun den Inhalt der Datei, um die Änderungen zu sehen:
cat sed_test.txt
Fortgeschrittene Sed-Nutzung
Nachdem wir die Grundlagen von sed verstanden haben, lassen Sie uns einige fortgeschrittenere Funktionen erkunden, die es zu einem mächtigen Werkzeug für die Textmanipulation machen.
Zeilen löschen:
sed '2d' sed_test.txtDies löscht die zweite Zeile der Datei. Der Befehl
dinsedsteht für "delete" (löschen).Text einfügen:
sed '1i\First line' sed_test.txtAufschlüsselung dieses Befehls:
1= Zeilennummer (vor Zeile 1 einfügen)i= Insert-Befehl (einfügen)\= Befehls-Abschlusszeichen (kein Trennzeichen wie beim Ersetzen-Befehl)First line= Der einzufügende Text
Dies fügt "First line" vor der ersten Zeile der Datei ein.
Text anhängen:
sed '$a\Last line' sed_test.txtAufschlüsselung dieses Befehls:
$= Steht für die letzte Zeilea= Append-Befehl (anhängen)\= Befehls-Abschlusszeichen (signalisiert das Ende des Befehls und den Beginn des Textes)Last line= Der anzuhängende Text
Dies hängt "Last line" am Ende der Datei an.
Mehrere Befehle:
sed -e 's/Hi/Hello/g' -e 's/labex/LabEx/g' sed_test.txtDies wendet mehrere Ersetzungen in einem Befehl an. Die Option
-eermöglicht es Ihnen, mehrere sed-Befehle anzugeben.Verwendung von regulären Ausdrücken:
sed 's/[Ww]orld/Universe/g' sed_test.txtDies verwendet einen regulären Ausdruck, um sowohl "World" als auch "world" zu finden und durch "Universe" zu ersetzen.
Erläuterung der Befehlssyntax:
2dlöscht die zweite Zeile. Sie können die Zahl ändern, um andere Zeilen zu löschen.1i\fügt Text vor der ersten Zeile ein.- Struktur:
Zeilennummer+i(insert) +\(Abschlusszeichen) +Text - Wichtig: Das
\ist hier KEIN Trennzeichen – es ist ein Abschlusszeichen, das den Befehl vom Text trennt.
- Struktur:
$a\hängt Text am Ende der Datei an.- Struktur:
$(letzte Zeile) +a(append) +\(Abschlusszeichen) +Text
- Struktur:
-eerlaubt die Angabe mehrerer sed-Befehle in einer einzigen Zeile.[Ww]ist ein regulärer Ausdruck, der entweder auf ein großes "W" oder ein kleines "w" passt.
Zusammenfassung der Trennzeichen-Nutzung in sed:
- Substitutions-Befehle (
s): Verwenden/als Trennzeichen:s/Muster/Ersatz/Flags - Einfüge-/Anhängen-Befehle (
i/a): Verwenden\als Befehls-Abschlusszeichen:i\Textodera\Text - Andere Trennzeichen: Sie können alternative Zeichen wie
#,|oder:in Substitutions-Befehlen verwenden.
Praktische Übung zum Verständnis von Trennzeichen:
Erstellen wir eine Datei mit Pfaden, um alternative Trennzeichen in Aktion zu sehen:
echo -e "/home/user/documents\n/var/log/messages\n/etc/passwd" > paths.txt
Versuchen Sie nun, Pfade mit verschiedenen Trennzeichen zu ersetzen:
## Verwendung von / als Trennzeichen (kann bei Pfaden unübersichtlich sein)
sed 's/\/home\/user/\/home\/newuser/g' paths.txt
## Verwendung von ## als Trennzeichen (viel klarer bei Pfaden)
sed 's#/home/user#/home/newuser#g' paths.txt
## Verwendung von | als Trennzeichen (ebenfalls klar)
sed 's|/home/user|/home/newuser|g' paths.txt
Alle drei Befehle bewirken dasselbe, aber die letzten beiden sind wesentlich einfacher zu lesen, wenn man mit Dateipfaden arbeitet!
Probieren Sie diese Befehle aus. Denken Sie daran, dass diese Änderungen nicht in der Datei gespeichert werden, sofern Sie nicht die Option -i verwenden.
Einführung in Awk
awk ist ein leistungsstarkes Textverarbeitungswerkzeug, das besonders gut mit strukturierten Daten umgehen kann. Es betrachtet jede Eingabezeile als einen Datensatz (Record) und jedes Wort in dieser Zeile als ein Feld. Beginnen wir mit einigen grundlegenden awk-Operationen.
Erstellen Sie zuerst eine neue Datei mit strukturierten Daten:
echo -e "Name Age Country\nAlice 25 USA\nBob 30 Canada\nCharlie 35 UK\nDavid 28 Australia" > awk_test.txt
Dies erstellt eine Datei namens awk_test.txt mit einer Kopfzeile und vier Datenzeilen.
Nun verwenden wir awk, um bestimmte Felder auszugeben:
awk '{print $1}' awk_test.txt
Dies gibt das erste Feld (Spalte) jeder Zeile aus. In awk bezieht sich $1 auf das erste Feld, $2 auf das zweite und so weiter. $0 bezieht sich auf die gesamte Zeile.
Um mehrere Felder auszugeben:
awk '{print $1, $2}' awk_test.txt
Dies gibt das erste und zweite Feld jeder Zeile aus.
Wir können auch Bedingungen verwenden:
awk '$2 > 28 {print $1 " is over 28"}' awk_test.txt
Dies gibt die Namen der Personen aus, die älter als 28 Jahre sind.
Versuchen wir etwas Komplexeres:
awk 'NR > 1 {sum += $2} END {print "Average age:", sum/(NR-1)}' awk_test.txt
Dies berechnet und gibt das Durchschnittsalter aus, wobei die Kopfzeile übersprungen wird.
Erläuterung:
- In
awkwird jede Zeile automatisch in Felder aufgeteilt, normalerweise durch Leerzeichen. $1,$2usw. beziehen sich auf die Felder in jeder Zeile.NRist eine eingebaute Variable, die die aktuelle Datensatznummer (Zeilennummer) darstellt.- Der
END-Block wird ausgeführt, nachdem alle Zeilen verarbeitet wurden. sum += $2addiert den Wert des zweiten Feldes (Alter) zu einer laufenden Summe.
Probieren Sie diese Befehle aus. awk ist unglaublich mächtig für Datenverarbeitungsaufgaben.
Zusammenfassung
In diesem Lab haben Sie die Grundlagen von drei leistungsstarken Textverarbeitungsbefehlen unter Linux gelernt:
grep: Zum Suchen von Textmustern mithilfe regulärer Ausdrücke.sed: Für die Stream-Editierung und Texttransformation.awk: Für fortgeschrittene Textverarbeitung und Datenextraktion.
Insbesondere bei der Verwendung von sed haben wir die Wirkung des g-Flags vertieft. Ohne das g-Flag ersetzt sed nur das erste gefundene Vorkommen in jeder Zeile; mit dem g-Flag werden alle Vorkommen in jeder Zeile ersetzt. Durch die Änderung der Beispieldatei auf mehrere Treffer pro Zeile konnten wir den Effekt des g-Flags deutlich beobachten.
Diese Werkzeuge sind für jeden Linux-Benutzer oder Systemadministrator unerlässlich. Sie ermöglichen es Ihnen, Dateien effizient zu durchsuchen, Texte zu modifizieren und spezifische Daten aus strukturierten Textdateien zu extrahieren. Je vertrauter Sie mit diesen Befehlen werden, desto mehr werden Sie feststellen, dass sie viele Textverarbeitungsaufgaben in Ihrer täglichen Arbeit mit Linux-Systemen erheblich vereinfachen können.
Denken Sie daran: Übung ist der Schlüssel zur Beherrschung dieser Werkzeuge. Versuchen Sie, sie in verschiedenen Szenarien einzusetzen, und erkunden Sie die Handbuchseiten (man grep, man sed, man awk) für weitere fortgeschrittene Funktionen und Optionen. Jeder dieser Befehle bietet weit mehr Möglichkeiten, als wir hier behandelt haben.



