Linux Professional Institute Learning Logo.
Weiter zum Inhalt
  • Home
    • Alle Ressourcen
    • LPI Lernmaterialien
    • Mitmachen
    • Publishing Partner
    • Publishing Partner werden
    • Über uns
    • FAQ
    • Mitwirkende
    • Roadmap
    • Kontakt
  • LPI.org
103.2 Lektion 1
Thema 101: Systemarchitektur
101.1 Hardwareeinstellungen ermitteln und konfigurieren
  • 101.1 Lektion 1
101.2 Das System starten
  • 101.2 Lektion 1
101.3 Runlevel wechseln und das System anhalten oder neu starten
  • 101.3 Lektion 1
Thema 102: Linux-Installation und -Paketverwaltung
102.1 Festplattenaufteilung planen
  • 102.1 Lektion 1
102.2 Einen Bootmanager installieren
  • 102.2 Lektion 1
102.3 Shared Libraries verwalten
  • 102.3 Lektion 1
102.4 Debian-Paketverwaltung verwenden
  • 102.4 Lektion 1
102.5 RPM und YUM-Paketverwaltung verwenden
  • 102.5 Lektion 1
102.6 Linux als Virtualisierungs-Gast
  • 102.6 Lektion 1
Thema 103: GNU- und Unix-Befehle
103.1 Auf der Befehlszeile arbeiten
  • 103.1 Lektion 1
  • 103.1 Lektion 2
103.2 Textströme mit Filtern verarbeiten
  • 103.2 Lektion 1
103.3 Grundlegende Dateiverwaltung
  • 103.3 Lektion 1
  • 103.3 Lektion 2
103.4 Ströme, Pipes und Umleitungen verwenden
  • 103.4 Lektion 1
  • 103.4 Lektion 2
103.5 Prozesse erzeugen, überwachen und beenden
  • 103.5 Lektion 1
  • 103.5 Lektion 2
103.6 Prozess-Ausführungsprioritäten ändern
  • 103.6 Lektion 1
103.7 Textdateien mit regulären Ausdrücken durchsuchen
  • 103.7 Lektion 1
  • 103.7 Lektion 2
103.8 Grundlegendes Editieren von Dateien
  • 103.8 Lektion 1
Thema 104: Geräte, Linux-Dateisysteme, Filesystem Hierarchy Standard
104.1 Partitionen und Dateisysteme anlegen
  • 104.1 Lektion 1
104.2 Die Integrität von Dateisystemen sichern
  • 104.2 Lektion 1
104.3 Das Mounten und Unmounten von Dateisystemen steuern
  • 104.3 Lektion 1
104.5 Dateizugriffsrechte und -eigentümerschaft verwalten
  • 104.5 Lektion 1
104.6 Symbolische und Hardlinks anlegen und ändern
  • 104.6 Lektion 1
104.7 Systemdateien finden und Dateien am richtigen Ort plazieren
  • 104.7 Lektion 1
How to get certified
  1. Thema 103: GNU- und Unix-Befehle
  2. 103.2 Textströme mit Filtern verarbeiten
  3. 103.2 Lektion 1

103.2 Lektion 1

Zertifikat:

LPIC-1

Version:

5.0

Thema:

103 GNU- und Unix-Befehle

Lernziel:

103.2 Textströme mit Filtern verarbeiten

Lektion:

1 von 1

Einführung

Der Umgang mit Text ist ein wichtiger Bestandteil der Arbeit eines jeden Systemadministrators. Doug McIlroy, ein Mitglied des ursprünglichen Unix-Entwicklungsteams, fasste die Unix-Philosophie zusammen und sagte (neben anderen wichtigen Dingen): "`Schreibe Programme, die Textströme bearbeiten, denn das ist eine universelle Schnittstelle." Linux ist vom Betriebssystem Unix inspiriert und übernimmt dessen Philosophie, so dass einem Administrator innerhalb einer Linux-Distribution viele Textmanipulationswerkzeuge zur Verfügung stehen.

Ein kurzer Überblick über Umleitungen und Pipes

Ebenfalls aus der Unix-Philosophie:

  • Schreibe Programme, die genau eine Sache machen, diese aber gut.

  • Schreibe Programme, die zusammenarbeiten.

Eine wichtige Möglichkeit der Zusammenarbeit von Programmen ist das piping und umleiten. So ziemlich alle Textmanipulationsprogramme erhalten den Text von einer Standardeingabe (stdin), geben ihn an die Standardausgabe (stdout) aus und senden eventuelle Fehler an die Standardfehlerausgabe (stderr). Wenn nicht anders angegeben, ist die Standardeingabe das, was Sie auf Ihrer Tastatur eingeben (nach dem Drücken der Eingabetaste liest ein Programm die eingegebene Zeichenkette ein). In ähnlicher Weise werden die Standardausgabe und die Fehler auf Ihrem Terminalbildschirm angezeigt. Lassen Sie uns sehen, wie dies funktioniert.

Geben Sie in Ihrem Terminal cat ein und drücken Sie dann die Eingabetaste. Geben Sie dann einen zufälligen Text ein.

$ cat
This is a test
This is a test
Hey!
Hey!
It is repeating everything I type!
It is repeating everything I type!
(I will hit ctrl+c so I will stop this nonsense)
(I will hit ctrl+c so I will stop this nonsense)
^C

Weitere Informationen über den Befehl cat (der Begriff kommt von “concatenate”) finden Sie in den Manpages.

Note

Wenn Sie an einer wirklich minimalen Installation eines Linux-Servers arbeiten, könnten einige Befehle wie info oder less nicht verfügbar sein. Wenn dies der Fall ist, installieren Sie diese Werkzeuge mit den richtigen Befehlen in Ihrem System, wie in den vorangegangenen Lektionen beschrieben.

Wie oben gezeigt, wird cat, ohne Angabe einer Eingabedatei, von der Standardeingabe (alle Eingaben) lesen und alles, was es liest, in das aktuelle Terminalfenster (der Standardausgabe) ausgeben.

Versuchen wir Folgendes:

$ cat > mytextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this
^C

$ cat mytextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Das > (größer als) weist cat an, seine Ausgabe in die Datei mytextfile umzuleiten und nicht in die Standardausgabe. Versuchen wir nun Folgendes:

$ cat mytextfile > mynewtextfile
$ cat mynewtextfile
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Dies hat den Effekt des Kopierens von mytextfile nach mynewtextfile. Sie können überprüfen, ob beiden Dateien identisch sind, indem Sie den Befehl diff verwenden:

$ diff mynewtextfile mytextfile

Die fehlende Ausgabe zeigt an, dass es sich um identische Dateiinhalte handelt. Testen wir nun den Umleitungsoperator (>>) aus, um Zeichen an bestehende Zeichen anzuhängen:

$ echo 'This is my new line' >> mynewtextfile
$ diff mynewtextfile mytextfile
4d3
< This is my new line

Bislang haben wir Umleitungen zum Erstellen und Manipulieren von Dateien verwendet. Wir können auch Pipes (dargestellt durch das Symbol |) verwenden, um die Ausgabe eines Programms in ein anderes Programm umzuleiten. Lassen Sie uns nach Zeilen mit dem Inhalt “this” suchen:

$ cat mytextfile | grep this
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

$ cat mytextfile | grep -i this
This is a test
I hope cat is storing this to mytextfile as I redirected the output
I will hit ctrl+c now and check this

Jetzt haben wir die Ausgabe von cat an ein anderes Kommando weitergeleitet: grep. Beachten Sie, wenn wir die Groß-/Kleinschreibung ignorieren (durch Verwendung der Option -i), erhalten wir als Ergebnis eine zusätzliche Zeile.

Verarbeitung von Textströmen

Lesen einer komprimierten Datei

Wir werden eine Datei namens ftu.txt erstellen, die eine Liste der folgenden Befehle enthält:

bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Nun werden wir den Befehl grep verwenden, um alle Zeilen auszugeben, welche die Zeichenfolge cat enthalten:

$ cat ftu.txt | grep cat
bzcat
cat
xzcat
zcat

Eine andere Möglichkeit, an diese Informationen zu gelangen, besteht darin, einfach den Befehl grep zu benutzen, um den Text direkt zu filtern. Dies erübrigt die Notwendigkeit den Textstrom an stdout über eine andere Anwendung weiterzuleiten.

$ grep cat ftu.txt
bzcat
cat
xzcat
zcat
Note

Denken Sie daran, dass unter Linux verschiedene Möglichkeiten existieren, um zum selben Resultat zu gelangen.

Es gibt noch andere Befehle, die mit komprimierten Dateien umgehen können (bzcat für bzip komprimierte Dateien, xzcat für xz komprimierte Dateien und zcat für gzip komprimierte Dateien), und jeder dieser Befehle wird verwendet, um den Inhalt einer komprimierten Datei basierend auf dem verwendeten Kompressionsalgorithmus anzuzeigen.

Überprüfen wir, ob die neu erstellte Datei ftu.txt die einzige im Verzeichnis ist, und erstellen dann eine gzip komprimierte Version der Datei:

$ ls ftu*
ftu.txt

$ gzip ftu.txt
$ ls ftu*
ftu.txt.gz

Durch Verwendung des Befehls zcat, wird der Inhalt der gezippten komprimierten Datei ausgegeben:

$ zcat ftu.txt.gz
bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Beachten Sie, dass gzip die Datei ftu.txt in die Datei ftu.txt.gz komprimiert und die Originaldatei entfernt. Standardmäßig wird keine Ausgabe des Befehls gzip angezeigt. Wenn Sie jedoch möchten, dass gzip anzeigt, was es tut, benutzen Sie die Option -v für eine ausführliche Ausgabe (verbose).

Anzeigen einer Datei mittels Pager

Sie wissen, dass cat eine Datei auf der Standardausgabe ausgibt (sobald eine Datei nach dem Befehl angegeben wird). Die Datei /var/log/syslog ist die Datei, in der Ihr Linux-System alles Wichtige speichert, was in Ihrem System vor sich geht. Verwenden Sie den Befehls sudo, um die nötigen Rechte zu erhalten die Datei /var/log/syslog auszulesen:

$ sudo cat /var/log/syslog

Sie werden hierzu eine schnell ablaufende Ausgabe im Konsolenfenster beobachten. Zur übersichtlicheren Ausgabe können Sie die Augabe mittels einer Pipeline an das Programm less weiterleiten, so dass die Ergebnisse manuell Zeile für Zeile durchlaufen werden können. Wenn Sie less benutzen, können Sie anhand der Pfeiltasten durch die Ausgabe navigieren und auch Befehle, welche an den Texteditor vi angelehnt sind, verwenden, um den Text zu durchsuchen und zu navigieren.

Anstatt jedoch den Befehl cat weiterzuleiten, ist es pragmatischer, das Programm less einfach direkt zu verwenden:

$ sudo less /var/log/syslog
... (output omitted for clarity)

Einen Teil einer Textdatei erhalten

Wenn nur der Anfang oder das Ende einer Datei überprüft werden muss, stehen andere Methoden zur Verfügung. Der Befehl head wird standardmäßig verwendet, um die ersten zehn Zeilen einer Datei zu lesen, und der Befehl tail wird standardmäßig verwendet, um die letzten zehn Zeilen einer Datei zu lesen. Versuchen Sie es selbst:

$ sudo head /var/log/syslog
Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
$ sudo tail /var/log/syslog
Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal
Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ")
Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor...
Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract'
Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor.
Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907)
Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911)
Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal
Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal
Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.

Um die Anzahl der angezeigten Zeilen zu veranschaulichen, können Sie die Ausgabe des Befehls head an den Befehl nl weiterleiten, welcher die gestreamten Textzeilen durchnummeriert:

$ sudo head /var/log/syslog | nl
1	Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
2	Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
3	Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
4	Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
5	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
6	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
7	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
8	Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
9	Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
10	Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)

Und Sie können dasselbe bewerkstelligen, indem Sie die Ausgabe des Befehls tail über eine Pipeline an den Befehl wc weiterleiten, der standardmäßig die Anzahl der Wörter innerhalb eines Dokuments zählt, und mit der Option -l die Anzahl der Textzeilen ausgibt, die der Befehl eingelesen hat:

$ sudo tail /var/log/syslog | wc -l
10

Sollte ein Administrator mehr (oder weniger) vom Anfang oder Ende einer Datei überprüfen müssen, kann die Option -n verwendet werden, um die Ausgabe der Befehle einzuschränken:

$ sudo tail -n 5 /var/log/syslog
Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded.
Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ")
Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor...
Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract'
Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor.
$ sudo head -n 12 /var/log/syslog
Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded.
Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files.
Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low)
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S'
Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T'
Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device!
Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
Nov 12 08:04:30 hypatia vdr: [882] no DVB device found
Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server

Die Grundlagen von sed, der Stream Editor

Werfen Sie einen Blick auf die anderen Dateien, Begriffe und Dienstprogramme, die nicht cat im Namen haben. Dies kann erreicht werden, indem wir die Option -v an grep übergeben, was den Befehl anweist, nur jene Zeilen auszugeben, welche cat nicht enthält:

$ zcat ftu.txt.gz | grep -v cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc

Das meiste, was mit grep umgesetzt werden kann, kann auch mit sed bewerkstelligt werden - dem Stream Editor zum Filtern und Transformieren von Text (wie auf der sed Handbuchseite beschrieben). Zuerst werden wir die Datei ftu.txt wiederherstellen, indem wir unser gzip Archiv dekomprimieren:

$ gunzip ftu.txt.gz
$ ls ftu*
ftu.txt

Nun kann sed verwendt werden, um nur die Zeilen aufzulisten, die die Zeichenkette cat enthalten:

$ sed -n /cat/p < ftu.txt
bzcat
cat
xzcat
zcat

Wir haben das Kleiner-als-Zeichen < benutzt, um den Inhalt der Datei ftu.txt into in den Befehl sed umzuleiten. Das zwischen Schrägstrichen eingeschlossene Wort (hier /cat/) ist der Begriff, nach dem wir suchen. Die Option -n weist sed an, keine Ausgabe zu erzeugen (es sei denn, die später durch den Befehl p angewiesene). Versuchen Sie, dasselbe Kommando ohne die Option -n auszuführen, um zu sehen, was passiert. Versuchen Sie anschließend Folgendes:

$ sed /cat/d < ftu.txt
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc

Wenn wir die Option -n nicht benutzen, wird sed alles aus der Datei ausgeben, außer dem, was d (für delete) sed anweist, aus der Ausgabe zu löschen.

Eine übliche Verwendung von sed ist das Suchen und Ersetzen von Text innerhalb einer Datei. Angenommen, Sie wollen jedes Vorkommen von cat in dog ändern. Sie können sed gepaart mit der Option s dazu verwenden, jede Instanz des ersten Begriffs cat durch den zweiten Begriff dog zu ersetzen:

$ sed s/cat/dog/ < ftu.txt
bzdog
dog
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzdog
zdog

Anstatt den Umleitungsoperator (<) zu benutzen, um die Datei ftu.txt an das Kommando sed zu übergeben, können wir sed einfach direkt mit der Datei arbeiten lassen. Das werden wir als nächstes versuchen, während wir gleichzeitig ein Backup der Originaldatei erstellen:

$ sed -i.backup s/cat/dog/ ftu.txt
$ ls ftu*
ftu.txt  ftu.txt.backup

Die Option -i führt ein unmittelbares Zurückspeichern des Resultats der sed Operation in die Originaldatei durch. Falls Sie nicht .backup nach dem -i Parameter verwenden, wird die Originaldatei einfach überschrieben. Was auch immer Sie als Text nach dem Parameter -i verwenden, wird als Dateiendung genutzt, um eine Backupdatei der Originaldatei anzulegen bevor sed die gewünschten Änderungen vornimmt.

Sicherstellung der Datenintegrität

Wir haben gezeigt, wie einfach es ist, Dateien unter Linux zu manipulieren. Es gibt Momente, in denen Sie eine Datei an jemand anderen weitergeben möchten, und wollen sicher stellen, dass der Empfänger am Ende eine exakte Kopie der Originaldatei erhält. Eine sehr häufige Anwendung dieser Technik wird praktiziert, wenn Server einer Linuxdistribution herunterladbare CD- oder DVD-Images ihrer Software zusammen mit Dateien hosten, welche die berechneten Prüfsummenwerte dieser Diskimages enthalten. Folgend eine Beispielliste eines Debian-Downloadservers:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[PARENTDIR] Parent Directory                                      -
[SUM]       MD5SUMS                              2019-09-08 17:46 274
[CRT]       MD5SUMS.sign                         2019-09-08 17:52 833
[SUM]       SHA1SUMS                             2019-09-08 17:46 306
[CRT]       SHA1SUMS.sign                        2019-09-08 17:52 833
[SUM]       SHA256SUMS                           2019-09-08 17:46 402
[CRT]       SHA256SUMS.sign                      2019-09-08 17:52 833
[SUM]       SHA512SUMS                           2019-09-08 17:46 658
[CRT]       SHA512SUMS.sign                      2019-09-08 17:52 833
[ISO]       debian-10.1.0-amd64-netinst.iso      2019-09-08 04:37 335M
[ISO]       debian-10.1.0-amd64-xfce-CD-1.iso    2019-09-08 04:38 641M
[ISO]       debian-edu-10.1.0-amd64-netinst.iso  2019-09-08 04:38 405M
[ISO]       debian-mac-10.1.0-amd64-netinst.iso  2019-09-08 04:38 334M
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

In der obigen Auflistung werden die Imagedateien des Debianinstallers von Textdateien begleitet, welche Prüfsummen der Dateien basierend auf verschiedenen Algorithmen (MD5, SHA1, SHA256 und SHA512) enthalten.

Note

Eine Prüfsumme ist ein Wert, der aus einer mathematischen Berechnung auf der Grundlage einer kryptografischen Hashfunktion von einer Datei abgeleitet wird. Es gibt verschiedene Arten von kryptografischen Hashfunktionen, die sich in ihrer Stärke unterscheiden. Die Prüfung setzt die Vertrautheit der Verwendung von md5sum, sha256sum und sha512sum voraus.

Sobald Sie eine Datei herunterladen (z.B. das Image debian-10.1.0-amd64-netinst.iso), würden Sie anschließend die Prüfsumme der heruntergeladenen Datei mit einem für Sie bereitgestellten Prüfsummenwert vergleichen.

Hier ist ein Beispiel, um die beschriebene Vorgehensweise zu veranschaulichen. Wir werden den SHA256 Wert der Datei ftu.txt mit dem Befehl sha256sum berechnen:

$ sha256sum ftu.txt
345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c  ftu.txt

Die lange Zeichenfolge vor dem Dateinamen ist der SHA256 Prüfsummenwert dieser Textdatei. Lassen Sie uns eine Datei erstellen, die diesen Wert enthält, damit wir ihn zur Überprüfung der Integrität unserer ursprünglichen Textdatei verwenden können. Wir können dies mit dem Befehl sha256sum umsetzen und die Ausgabe in eine Datei umleiten:

$ sha256sum ftu.txt > sha256.txt

Um nun die Datei ftu.txt zu verifizieren, verwenden wir einfach erneut den Befehl und geben den Dateinamen, der unseren Prüfsummenwert enthält, zusammen mit der Option -c an:

$ sha256sum -c sha256.txt
ftu.txt: OK

Der in der Datei enthaltene Wert stimmt mit der berechneten SHA256 Prüfsumme für unsere ftu.txt-Datei überein, genau wie erwartet. Wenn jedoch die Originaldatei verändert würde (z.B. ein paar Bytes während eines Dateidownloads verloren gingen oder jemand absichtlich daran herumgepfuscht hätte), würde die Prüfung fehlschlagen. In solchen Fällen wissen wir, dass unsere Datei fehlerhaft oder beschädigt ist, und wir können der Integrität ihres Inhalts nicht vertrauen. Um dies zu beweisen, fügen wir am Ende der Datei folgenden Text hinzu:

$ echo "new entry" >> ftu.txt

Nun werden wir erneut den Versuch unternehmen, die Integrität der Datei zu überprüfen:

$ sha256sum -c sha256.txt
ftu.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

Und wir sehen, dass die Prüfsumme nicht mit dem Wert übereinstimmt, welcher für die Datei erwartet wurde. Daher können wir der Integrität dieser Datei nicht vertrauen. Wir könnten versuchen, eine neue Kopie einer Datei herunterzuladen, den Absender der Datei über das Scheitern der Prüfsumme zu informieren oder sie je nach Wichtigkeit der Datei einem Sicherheitsteam des Rechenzentrums melden.

Tiefere Einblicke in Dateien

Der Befehl octal dump (od) wird oft zum Debuggen von Anwendungen und verschiedenen Dateien verwendet. Der Befehl od selbst listet lediglich den Inhalt einer Datei im Oktalformat auf. Wir können unsere zuvor verwendete Datei `ftu.txt verwenden, um eine Beispielausgabe zu erzeugen:

$ od ftu.txt
0000000 075142 060543 005164 060543 005164 072543 005164 062550
0000020 062141 066012 071545 005163 062155 071465 066565 067012
0000040 005154 062157 070012 071541 062564 071412 062145 071412
0000060 060550 032462 071466 066565 071412 060550 030465 071462
0000100 066565 071412 071157 005164 070163 064554 005164 060564
0000120 066151 072012 005162 067165 070551 073412 005143 075170
0000140 060543 005164 061572 072141 000012
0000151

Die erste Spalte der Ausgabe ist der Offset für jede Ausgabezeile in Byte. Da od Informationen standardmäßig im Oktalformat ausgibt, beginnt jede Zeile mit dem Byteoffset von acht Bits, gefolgt von acht Spalten, von denen jede den Oktalwert der Daten innerhalb dieser Spalte enthält.

Tip

Erinnern Sie sich, dass ein Byte 8 Bit entspricht.

Wenn Sie den Inhalt einer Datei im hexadezimalen Format anzeigen wollen, verwenden Sie die Option -x:

$ od -x ftu.txt
0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568
0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a
0000040 0a6c 646f 700a 7361 6574 730a 6465 730a
0000060 6168 3532 7336 6d75 730a 6168 3135 7332
0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174
0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78
0000140 6163 0a74 637a 7461 000a
0000151

Nun wird jede der acht Spalten nach dem Byteoffset durch ihre hexadezimalen Äquivalente dargestellt.

Ein praktischer Gebrauch des Befehls od ist das Debuggen von Skripten. Zum Beispiel kann der Befehl od normalerweise nicht sichtbare Zeichen anzeigen, die innerhalb einer Datei existieren, wie z.B. Zeilenumbrüche. Dies kann mit der Option -c veranlasst werden, so dass statt der numerischen Notation für jedes Byte diese Spalteneinträge als ihre Zeichenäquivalente angezeigt werden:

$ od -c ftu.txt
0000000   b   z   c   a   t  \n   c   a   t  \n   c   u   t  \n   h   e
0000020   a   d  \n   l   e   s   s  \n   m   d   5   s   u   m  \n   n
0000040   l  \n   o   d  \n   p   a   s   t   e  \n   s   e   d  \n   s
0000060   h   a   2   5   6   s   u   m  \n   s   h   a   5   1   2   s
0000100   u   m  \n   s   o   r   t  \n   s   p   l   i   t  \n   t   a
0000120   i   l  \n   t   r  \n   u   n   i   q  \n   w   c  \n   x   z
0000140   c   a   t  \n   z   c   a   t  \n
0000151

Alle Zeilenumbrüche innerhalb der Datei werden durch die Zeichen \n dargestellt. Wenn Sie nur alle Zeichen innerhalb einer Datei sehen wollen und die Byteoffset Informationen nicht ausgeben möchten, kann die Spalte mit den Byteoffsetwerten auf folgende Weise aus der Ausgabe entfernt werden:

$ od -An -c ftu.txt
   b   z   c   a   t  \n   c   a   t  \n   c   u   t  \n   h   e
   a   d  \n   l   e   s   s  \n   m   d   5   s   u   m  \n   n
   l  \n   o   d  \n   p   a   s   t   e  \n   s   e   d  \n   s
   h   a   2   5   6   s   u   m  \n   s   h   a   5   1   2   s
   u   m  \n   s   o   r   t  \n   s   p   l   i   t  \n   t   a
   i   l  \n   t   r  \n   u   n   i   q  \n   w   c  \n   x   z
   c   a   t  \n   z   c   a   t  \n

Geführte Übungen

  1. Jemand hat gerade einen Laptop an Ihre Schule gespendet, und jetzt möchten Sie Linux darauf installieren. Es gibt kein Handbuch, und Sie waren gezwungen, ihn von einem USB Stick ohne jegliche Grafik zu booten. Sie erhalten ein Shellterminal und Sie wissen, dass für jeden Prozessor, den Sie haben, eine Zeile in der Datei /proc/cpuinfo vorhanden ist:

    processor	: 0
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (lines skipped)
    
    processor	: 1
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (more lines skipped)
    • Mit den Befehlen grep und wc können Sie anzeigen, wie viele Prozessoren Ihr System besitzt.

    • Bewerkstelligen Sie dieselbe Ausgabe mit sed anstelle von grep.

  2. Durchsuchen Sie die lokale Datei /etc/passwd mit den Befehlen grep, sed, head und tail gemäß den unten aufgeführten Aufgaben:

    • Welche Benutzer haben Zugriff auf eine Bashshell?

    • Ihr System hat verschiedene Benutzer, die für die Handhabung bestimmter Programme oder für administrative Zwecke existieren. Diese Benutzer haben jedoch keinen Zugriff auf eine Shell. Wie viele davon gibt es in Ihrem System?

    • Wie viele Benutzer und Gruppen existieren in Ihrem System (denken Sie daran: benutzen Sie nur die Datei /etc/passwd)?

    • Listen Sie nur die erste Zeile, die letzte Zeile und die zehnte Zeile der Datei /etc/passwd auf.

  3. Betrachten Sie das Beispiel der Datei /etc/passwd. Kopieren Sie für diese Übung die folgenden Zeilen in eine lokale Datei namens mypasswd.

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin
    libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
    libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
    carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
    dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh
    emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash
    frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash
    grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh
    henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash
    john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
    • Listen Sie alle Benutzer in der Gruppe 1000 (verwenden Sie sed, um nur das entsprechende Feld auszuwählen) aus der Datei mypasswd auf.

    • Listen Sie nur die vollständigen Namen aller Benutzer für diese Gruppe auf (verwenden Sie sed und cut).

Offene Übungen

  1. Verwenden Sie erneut die Datei mypasswd aus der vorangegangenen Übungen, um einen Bashbefehl zu entwickeln, der eine Person aus dem Main Office auswählt, welche für ein Gewinnspiel ausgelost werden soll. Benutzen Sie den Befehl sed, um alle Zeilen mit Benutzern aus dem Main Office anzeigen zu lassen, und dann eine Befehlssequenz cut, um den Vornamen jedes Benutzers aus diesen Zeilen herauszutrennen. Als nächstes werden Sie diese Namen nach dem Zufallsprinzip sortieren und nur den obersten Namen aus der Liste ausgeben.

  2. Wie viele Personen arbeiten in den Bereichen Finance, Engineering und Sales? (Erwägen Sie, den Befehl uniq einzubeziehen.)

  3. Nun soll eine CSV-Datei (kommagetrennte Werte) vorbereitet werden, damit aus der Datei mypasswd im vorherigen Beispiel die Datei names.csv einfach in LibreOffice importieren werden kann. Der Inhalt der Datei hat folgendes Format:

    First Name,Last Name,Position
    Carol,Smith,Finance
    ...
    John,Chapel,Sales

    Tipp: Verwenden Sie die Befehle sed, cut, und paste, um die gewünschten Ergebnisse zu erzielen. Beachten Sie, dass das Komma (,) das Begrenzungszeichen für diese Datei ist.

  4. Angenommen, die in der vorherigen Übung erstellte Tabelle names.csv ist eine wichtige Datei. Es soll sichergestellt werden, dass niemand diese unbemerkt manipuliert — von dem Moment an, in dem sie an jemanden gesendet wird, bis zu dem Moment, in dem der Empfänger sie erhält. Wie stellen Sie die Integrität dieser Datei mittels md5sum sicher?

  5. Sie haben sich selbst versprochen, dass Sie ein klassisches Buch mit 100 Zeilen pro Tag lesen werden, und Sie beschlossen, mit Mariner and Mystic von Herman Melville zu beginnen. Entwickeln Sie einen Befehl mit split, der dieses Buch in Abschnitte von jeweils 100 Zeilen unterteilt. Um das Buch im reinen Textformat zu erhalten, suchen Sie es unter https://www.gutenberg.org.

  6. Wenn Sie ls -l im Verzeichnis /etc benutzen, welche Ausgabe erhalten Sie? Wenn Sie den Befehl cut auf die Ausgabe des gegebenen Befehls ls anwenden, auf welche Vorgehensweise würden Sie nur die Dateinamen herausschneiden? Was ist mit dem Dateinamen und dem Besitzer der Dateien? Zusammen mit den Befehlen ls -l und cut verwenden Sie auch den Befehl tr, um mehrere Leerzeichen zu einem einzelnen Leerzeichen zu reduzieren, was die Formatierung der Ausgabe mit dem Befehl cut erleichtert.

  7. Diese Übung geht davon aus, dass Sie sich auf einer realen Maschine (nicht auf einer virtuellen Maschine) befinden. Außerdem müssen Sie einen USB Stick bei sich haben. Lesen Sie die Handbuchseiten für den Befehl tail und finden Sie heraus, wie man einer Datei folgt, wenn Text fortlaufend an diese angehängt wird. Verbinden Sie einen USB Stick mit dem System, während Sie die Ausgabe eines Befehls tail von der Datei /var/log/syslog überwachen. Notieren Sie den vollständigen Befehl, den Sie verwenden würden, um das Produkt, den Hersteller und die Gesamtmenge des Speichers Ihres USB Sticks zu erhalten.

Zusammenfassung

Der Umgang mit Textströmen ist bei der Administration eines Linux-Systems von großer Bedeutung. Textströme können mit Hilfe von Skripten verarbeitet werden, um tägliche Aufgaben zu automatisieren oder relevante Debugginginformationen in Protokolldateien zu finden. Folgend eine kurze Zusammenfassung der in dieser Lektion behandelten Befehle:

cat

Wird verwendet, um reine Textdateien zu kombinieren oder zu lesen.

bzcat

Erlaubt die Verarbeitung oder das Lesen von Dateien, die mittels bzip2 komprimiert wurden.

xzcat

Erlaubt das Verarbeiten oder das Lesen von Dateien, die mittels xz komprimiert wurden.

zcat

Erlaubt die Verarbeitung oder das Lesen von Dateien, die mittels gzip komprimiert wurden.

less

Dieser Befehl listet den Inhalt einer Datei zeilenweise und ermöglicht Navigations- und Suchfunktionen.

head

Dieser Befehl zeigt standardmäßig die ersten 10 Zeilen einer Datei an. Mit der Option -n können weniger oder mehr Zeilen angezeigt werden.

tail

Dieser Befehl zeigt standardmäßig die letzten 10 Zeilen einer Datei an. Mit Hilfe der Option -n können weniger oder mehr Zeilen angezeigt werden. Die Option -f wird benutzt, um die Ausgabe einer Textdatei zu verfolgen, in welche fortlaufend neue Daten geschrieben werden.

wc

Kurz für “word count”, abhängig von den verwendeten Parametern, werden Zeichen, Wörter und/oder Zeilen gezählt.

sort

Wird verwendet, um die Ausgabe eines Verzeichnisses alphabetisch, umgekehrt alphabetisch oder in zufälliger Reihenfolge zu sortieren.

uniq

Wird verwendet, um übereinstimmende Zeichenketten aufzulisten (und zu zählen).

od

Der Befehl “octal dump” wird verwendet, um eine Binärdatei entweder in oktaler, dezimaler oder hexadezimaler Notation anzuzeigen.

nl

Der Befehl “number line” zeigt die Anzahl der Zeilen in einer Datei an und erstellt eine Datei neu, wobei jeder Zeile die Zeilennummer vorangestellt wird.

sed

Der Stream Editor kann verwendet werden, um übereinstimmende Vorkommen von Zeichenketten mit Hilfe von regulären Ausdrücken zu finden und um Dateien nach vordefinierten Mustern zu editieren.

tr

Der Befehl “translate” kann Zeichen ersetzen, entfernt und komprimiert sich wiederholende Zeichen.

cut

Dieser Befehl kann Spalten von Textdateien in Felder auftrennen, die von einem Trennzeichen getrennt werden.

paste

Zusammenfügen von Dateien in Spalten basierend auf der Verwendung von Feldtrennzeichen.

split

Dieser Befehl kann größere Dateien in kleinere Dateien aufteilen, abhängig von den Kriterien, die durch die Optionen des Befehls festgelegt sind.

md5sum

Wird zur Berechnung des MD5 Hashwertes einer Datei oder mehrerer Dateien verwendet. Wird auch verwendet, um eine Datei gegen einen vorhandenen Hashwert zu verifizieren, um die Integrität einer Datei sicherzustellen.

sha256sum

Wird zur Berechnung des SHA256 Hashwertes einer Datei verwendet. Wird auch verwendet, um eine Datei gegen einen vorhandenen Hashwert zu verifizieren, um die Integrität einer Datei sicherzustellen.

sha512sum

Wird zur Berechnung des SHA512 Hashwertes einer Datei verwendet. Wird auch verwendet, um eine Datei gegen einen vorhandenen Hashwert zu verifizieren, um die Integrität einer Datei sicherzustellen.

Lösungen zu den geführten Übungen

  1. Jemand hat gerade einen Laptop an Ihre Schule gespendet, und jetzt möchten Sie Linux darauf installieren. Es gibt kein Handbuch, und Sie waren gezwungen, ihn von einem USB Stick ohne jegliche Grafik zu booten. Sie erhalten ein Shellterminal und Sie wissen, dass für jeden Prozessor, den Sie haben, eine Zeile in der Datei /proc/cpuinfo vorhanden ist:

    processor	: 0
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (lines skipped)
    
    processor	: 1
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 158
    
    (more lines skipped)
    • Mit den Befehlen grep und wc können Sie anzeigen, wie viele Prozessoren Ihr System besitzt.

      Folgend zwei Möglichkeiten:

      $ cat /proc/cpuinfo | grep processor | wc -l
      $ grep processor /proc/cpuinfo | wc -l

      Jetzt, da Sie wissen, dass es mehrere Möglichkeiten gibt, das Gleiche zu tun: wann sollten Sie die eine oder die andere Möglichkeit anwenden? Das hängt von mehreren Faktoren ab, wobei die beiden wichtigsten die Leistung und die Lesbarkeit sind. Die meiste Zeit werden Sie Shellbefehle innerhalb von Shellskripten verwenden, um Ihre Aufgaben zu automatisieren, und je größer und komplexer Ihre Skripte werden, desto mehr müssen Sie sich darum kümmern, dass diese schnell abgearbeitet werden.

    • Bewerkstelligen Sie dieselbe Ausgabe mit sed anstelle von grep.

      Statt mit grep werden wir dies nun mit sed versuchen:

      $ sed -n /processor/p /proc/cpuinfo | wc -l

      Hier haben wir sed mit dem Parameter -n verwendet, so dass sed nichts ausgibt, außer dem, was mit dem Ausdruck processor übereinstimmt, wie durch den Befehl p angewiesen. Wie bei den Variante mit grep wird wc -l die Anzahl der Zeilen zählen, also die Anzahl der Prozessoren, die wir haben.

      Studieren Sie nun das nächste Beispiel:

      $ sed -n /processor/p /proc/cpuinfo | sed -n '$='

      Diese Befehlssequenz liefert das identische Ergebnis wie das vorherige Beispiel, bei dem die Ausgabe von sed in den Befehl wc umgeleitet wurde. Der Unterschied besteht darin, dass statt der Verwengung von wc -l zum Zählen der Zeilenzahl, sed erneut aufgerufen wird, um die gleiche Funktionalität zu erfüllen. Wieder einmal unterdrücken wir die Ausgabe von sed mit der Option -n, mit Ausnahme des Ausdrucks, den wir explizit aufrufen, nämlich '$='. Dieser Ausdruck weist sed an, mit der letzten Zeile ($) übereinzustimmen und dann diese Zeilennummer (=) auszugeben.

  2. Durchsuchen Sie die lokale Datei /etc/passwd mit den Befehlen grep, sed, head und tail gemäß den unten aufgeführten Aufgaben:

    • Welche Benutzer haben Zugriff auf eine Bashshell?

      $ grep ":/bin/bash$" /etc/passwd

      Wir werden diese Antwort verbessern, indem wir nur den Namen des Benutzers anzeigen, der die Bashshell verwenden darf.

      $ grep ":/bin/bash$" /etc/passwd | cut -d: -f1

      Der Benutzername ist das erste Feld (Parameter -f1 des cut Befehls) und die Datei /etc/passwd verwendet : als Trennzeichen (Parameter -d: des cut Befehls), wir leiten die Ausgabe des grep Befehls einfach an den entsprechenden cut Befehl weiter.

    • Ihr System hat verschiedene Benutzer, die für die Handhabung bestimmter Programme oder für administrative Zwecke existieren. Diese Benutzer haben jedoch keinen Zugriff auf eine Shell. Wie viele davon gibt es in Ihrem System?

      Der einfachste Weg, dies herauszufinden, ist die Ausgabe der Zeilen aller Konten, die nicht die Bashshell verwenden:

      $ grep -v ":/bin/bash$" /etc/passwd | wc -l
    • Wie viele Benutzer und Gruppen existieren in Ihrem System (denken Sie daran: benutzen Sie nur die Datei /etc/passwd)?

      Das erste Feld einer beliebigen Zeile in Ihrer Datei /etc/passwd ist der Benutzername, das Zweite ist typischerweise ein x, das anzeigt, dass das Benutzerpasswort nicht hier gespeichert ist (es ist in der Datei /etc/shadow verschlüsselt abgelegt). Das dritte Feld ist die Benutzer-ID (UID) und das Vierte ist die Gruppen-ID (GID). Dies sollte also die Anzahl der Benutzer ergeben:

      $ cut -d: -f3 /etc/passwd | wc -l

      Das wird in den meisten Fallen der Fall sein. Es gibt jedoch Situationen, in denen verschiedene Superuser oder andere spezielle Arten von Benutzern mit derselben UID (Benutzer-ID) eingerichten wurden. Um auf der sicheren Seite zu sein, werden wir also das Ergebnis unseres Befehls cut an den Befehl sort weiterleiten und dann die Anzahl der Zeilen zählen.

      $ cut -d: -f3 /etc/passwd | sort -u | wc -l

      Nun zur Anzahl der Gruppen:

      $ cut -d: -f4 /etc/passwd | sort -u | wc -l
    • Listen Sie nur die erste Zeile, die letzte Zeile und die zehnte Zeile der Datei /etc/passwd auf.

      Folgendes wird dazu ausreichen:

      $ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd

      Denken Sie daran, dass der Parameter -n sed anweist, nichts anderes auszugeben als das, was durch den Befehl p angegeben wird. Das hier verwendete Dollarzeichen ($) ist ein regulärer Ausdruck, welcher der letzten Zeile einer Datei entspricht.

  3. Betrachten Sie das Beispiel der Datei /etc/passwd. Kopieren Sie für diese Übung die folgenden Zeilen in eine lokale Datei namens mypasswd.

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin
    libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin
    libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin
    carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
    dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh
    emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash
    frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash
    grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh
    henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash
    john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
    • Listen Sie alle Benutzer in der Gruppe 1000 (verwenden Sie sed, um nur das entsprechende Feld auszuwählen) aus der Datei mypasswd auf.

      Die GID ist das vierte Feld in der Datei /etc/passwd. Eine Option dafür könnte folgendes sein:

      $ sed -n /1000/p mypasswd

      In diesem Fall erhalten Sie auch diese Zeile:

      carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash

      Sie wissen, dass dies nicht korrekt ist, da Carol Smith ein Mitglied von GID 2000 ist und die Übereinstimmung aufgrund der UID erfolgte. Sie haben jedoch vielleicht bemerkt, dass nach der GID das nächste Feld mit einem Großbuchstaben beginnt. Wir können einen regulären Ausdruck verwenden, um dieses Problem zu lösen.

      $ sed -n /:1000:[A-Z]/p mypasswd

      Der Ausdruck [A-Z] passt auf jedes einzelne Großbuchstabenzeichen. Mehr dazu erfahren Sie in der entsprechenden Lektion.

    • Listen Sie nur die vollständigen Namen aller Benutzer für diese Gruppe auf (verwenden Sie sed und cut).

      Verwenden Sie dieselbe Technik, die Sie zur Lösung des ersten Teils dieser Übung verwendet haben, und leiten Sie die Ausgabe an einen Befehl cut weiter.

      $ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5
      Dave Edwards,Finance,,,Main Office
      Emma Jones,Finance,,,Main Office
      Frank Cassidy,Finance,,,Main Office
      Grace Kearns,Engineering,,,Main Office
      Henry Adams,Sales,,,Main Office
      John Chapel,Sales,,,Main Office

      Noch nicht ganz! Beachten Sie, dass die Felder innerhalb Ihrer Ergebnisse durch , getrennt werden können. Also leiten wir die Ausgabe an einen anderen cut-Befehl weiter und verwenden das , als Trennzeichen.

      $ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1
      Dave Edwards
      Emma Jones
      Frank Cassidy
      Grace Kearns
      Henry Adams
      John Chapel

Lösungen zu den offenen Übungen

  1. Verwenden Sie erneut die Datei mypasswd aus der vorangegangenen Übungen, um einen Bashbefehl zu entwickeln, der eine Person aus dem Main Office auswählt, welche für ein Gewinnspiel ausgelost werden soll. Benutzen Sie den Befehl sed, um alle Zeilen mit Benutzern aus dem Main Office anzeigen zu lassen, und dann eine Befehlssequenz cut, um den Vornamen jedes Benutzers aus diesen Zeilen herauszutrennen. Als nächstes werden Sie diese Namen nach dem Zufallsprinzip sortieren und nur den obersten Namen aus der Liste ausgeben.

    Untersuchen Sie zunächst, wie der Parameter -R die Ausgabe des Befehls sort manipuliert. Wiederholen Sie diesen Befehl ein paar Mal auf Ihrem Rechner (beachten Sie, dass Sie 'Main Office' in einfache Anführungszeichen einschließen müssen, damit sed es als einzelne Zeichenfolge behandelt):

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R

    Hier ist eine Lösung für das Problem:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
  2. Wie viele Personen arbeiten in den Bereichen Finance, Engineering und Sales? (Erwägen Sie, den Befehl uniq einzubeziehen.)

    Bauen Sie weiter auf dem auf, was Sie in den vorherigen Übungen gelernt haben. Versuchen Sie nun das Folgende:

    $ sed -n /'Main Office'/p mypasswd
    $ sed -n /'Main Office'/p mypasswd | cut -d, -f2

    Beachten Sie, dass wir uns nicht um das : als Begrenzungszeichen kümmern. Von Interesse ist nur das zweite Feld, wenn wir die Zeilen durch das Zeichen , trennen.

    $ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c
          4 Finance
          1 Engineering
          2 Sales

    Der Befehl uniq gibt nur die eindeutigen Zeilen aus (keine sich wiederholenden Zeilen) und der Parameter -c weist uniq an, die Häufigkeit der gleichen Zeilen zu zählen. Hier gibt es eine Einschränkung: uniq wird nur benachbarte Zeilen berücksichtigen. Wenn dies nicht der Fall ist, kann der Befehl sort aushelfen.

  3. Nun soll eine CSV-Datei (kommagetrennte Werte) vorbereitet werden, damit aus der Datei mypasswd im vorigen Beispiel die Datei names.csv einfach in LibreOffice importiert werden kann. Der Inhalt der Datei soll wie folgt formatiert sein:

    First Name,Last Name,Position
    Carol,Smith,Finance
    ...
    John,Chapel,Sales

    Tipp: Verwenden Sie die Befehle sed, cut und paste, um das gewünschte Ergebnis zu erhalten. Beachten Sie, dass das Komma (,) als Trennzeichen für diese Datei dient.

    Beginnen Sie mit den Befehlen sed und cut und bauen Sie auf dem auf, was Sie aus den vorangegangenen Übungen gelernt haben:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname

    Jetzt haben wir die Datei firstname mit den Vornamen unserer Mitarbeiter.

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname

    Jetzt haben wir die Datei lastname, welche die Nachnamen der einzelnen Mitarbeiter enthält.

    Im nächsten Schritt stellen wir fest, in welcher Abteilung jeder Mitarbeiter arbeitet:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department

    Bevor wir an der endgültigen Lösung arbeiten, probieren Sie die folgenden Befehle aus, um zu sehen, welche Ausgabe diese erzeugen:

    $ cat firstname lastname department
    $ paste firstname lastname department

    Und nun zur abschließenden Lösung:

    $ paste firstname lastname department | tr '\t' ,
    $ paste firstname lastname department | tr '\t' , > names.csv

    Hier verwenden wir den Befehl tr, um \t, das Tabulatorzeichen, in ein , zu “übersetzen” (translate). tr ist recht nützlich, wenn wir ein Zeichen gegen ein anderes austauschen müssen. Lesen Sie unbedingt die Manpages sowohl für tr als auch für paste. Wir können zum Beispiel die Option -d für das Trennzeichen verwenden, um den vorherigen Befehl weniger komplex zu gestalten:

    $ paste -d, firstname lastname department

    Wir haben den Befehl paste benutzt, um mit ihm vertraut zu werden. Allerdings hätten wir alle Aufgaben auch in einer einzigen Befehlszeile erledigen können:

    $ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
  4. Angenommen, die in der vorherigen Übung erstellte Tabelle names.csv ist eine wichtige Datei. Es soll sichergestellt werden, dass niemand diese unbemerkt manipuliert — von dem Moment an, in dem sie an jemanden gesendet wird, bis zu dem Moment, in dem der Empfänger sie erhält. Wie stellen Sie die Integrität dieser Datei mittels md5sum sicher?

    Wenn Sie in die Handbuchseiten für md5sum, sha256sum und sha512sum schauen, werden Sie sehen, dass sie alle mit dem folgenden Text beginnen:

    “compute and check XXX message digest”

    Wobei “XXX” der Algorithmus ist, der verwendet wird, um diesen Message Digest zu erstellen.

    Wir werden md5sum als Beispiel verwenden, und später können Sie es mit den anderen Befehlen versuchen.

    $ md5sum names.csv
    61f0251fcab61d9575b1d0cbf0195e25  names.csv

    Nun können Sie die Datei z. B. über einen sicheren FTP-Dienst zur Verfügung stellen und den generierten Message Digest über ein anderes sicheres Kommunikationsmittel versenden. Wenn die Datei leicht verändert wurde, wird der Message Digest komplett anders aussehen. Bearbeiten Sie zum Beweis names.csv und ändern Sie Jones in James, wie hier gezeigt:

    $ sed -i.backup s/Jones/James/ names.csv
    $ md5sum names.csv
    f44a0d68cb480466099021bf6d6d2e65  names.csv

    Wenn Sie Dateien zum Herunterladen zur Verfügung stellen, ist es immer eine gute Praxis, auch einen Message Digest zu verteilen, damit Leute, die Ihre Datei herunterladen, einen eigenen Message Digest erstellen und mit dem Original vergleichen können. Wenn Sie https://kernel.org durchblättern, finden Sie die Seite https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc, auf der Sie die sha256sum für alle zum Herunterladen verfügbaren Dateien erhalten.

  5. Sie haben sich selbst versprochen, dass Sie ein klassisches Buch mit 100 Zeilen pro Tag lesen werden, und Sie beschlossen, mit Mariner and Mystic von Herman Melville zu beginnen. Entwickeln Sie einen Befehl mit split, der dieses Buch in Abschnitte von jeweils 100 Zeilen unterteilt. Um das Buch im reinen Textformat zu erhalten, suchen Sie es unter https://www.gutenberg.org.

    Zuerst werden wir das ganze Buch von der Website des Project Gutenberg herunterladen, wo Sie dieses und andere Bücher, die im öffentlichen Bereich verfügbar sind, erhalten können.

    $ wget https://www.gutenberg.org/files/50461/50461-0.txt

    Möglicherweise müssen Sie wget installieren, falls es nicht bereits in Ihrem System installiert ist. Alternativ können Sie auch curl verwenden. Verwenden Sie less, um die heruntergeladene Buchdatei zu verifizieren:

    $ less 50461-0.txt

    Nun werden wir das Buch in Stücke von je 100 Zeilen aufteilen:

    $ split -l 100 -d 50461-0.txt melville

    50461-0.txt ist die Datei, die wir aufteilen werden. melville wird das Präfix für die gesplitteten Dateien sein. -l 100 gibt die Anzahl der Zeilen an und die Option -d weißt split an, dass die Dateien nummeriert werden sollen (unter Verwendung des angegebenen Suffixes). Sie können nl für jede der gesplitteten Dateien verwenden (wahrscheinlich aber nicht für die Letzte) und bestätigen, dass jede der gesplitteten Dateien 100 Zeilen enthält.

  6. Wenn Sie ls -l im Verzeichnis /etc benutzen, welche Ausgabe erhalten Sie? Wenn Sie den Befehl cut auf die Ausgabe des gegebenen Befehls ls anwenden, auf welche Vorgehensweise würden Sie nur die Dateinamen herausschneiden? Was ist mit dem Dateinamen und dem Besitzer der Dateien? Zusammen mit den Befehlen ls -l und cut verwenden Sie auch den Befehl tr, um mehrere Leerzeichen zu einem einzelnen Leerzeichen zu reduzieren, was die Formatierung der Ausgabe mit dem Befehl cut erleichtert.

    Der Befehl ls selbst gibt nur die Namen der Dateien aus. Wir können jedoch die Ausgabe mittels ls -l (die lange Liste) erweitern, um spezifischere Informationen zu erhalten.

    $ ls -l /etc | tr -s ' ' ,
    drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi
    -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf
    -rw-r--r--,1,root,root,10,out,2,17:38,adjtime
    drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives
    -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab
    -rw-r--r--,1,root,root,433,out,1,2017,apg.conf
    drwxr-xr-x,6,root,root,4096,dez,17,2018,apm
    drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor
    drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d

    Der Parameter -s weist tr an, die wiederholten Räume zu einer einzigen Instanz eines Raumes zu schrumpfen. Der Befehl tr funktioniert für jede Art von sich wiederholenden Zeichen, die Sie angeben. Dann werden die Leerzeichen durch ein Komma , ersetzt. Eigentlich brauchen die Leerzeichen im Beispiel nicht zu ersetzen werden, also kann man das , einfach weglassen.

    $ ls -l /etc | tr -s ' '
    drwxr-xr-x 3 root root 4096 out 24 16:58 acpi
    -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf
    -rw-r--r-- 1 root root 10 out 2 17:38 adjtime
    drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives
    -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab
    -rw-r--r-- 1 root root 433 out 1 2017 apg.conf
    drwxr-xr-x 6 root root 4096 dez 17 2018 apm
    drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor

    Wenn man nur die Dateinamen erhalten möchte, braucht nur das neunte Feld ausgegeben werden:

    $ ls -l /etc | tr -s ' ' | cut -d" " -f9

    Für den Dateinamen und den Eigentümer einer Datei benötigt man das neunte und das dritte Feld:

    $ ls -l /etc | tr -s ' ' | cut -d" " -f9,3

    Was ist, wenn nur die Namen der Ordner und deren Eigentümer benötigt werden?

    $ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
  7. Diese Übung geht davon aus, dass Sie sich auf einer realen Maschine (nicht auf einer virtuellen Maschine) befinden. Außerdem müssen Sie einen USB Stick bei sich haben. Lesen Sie die Handbuchseiten für den Befehl tail und finden Sie heraus, wie man einer Datei folgt, wenn Text fortlaufend an diese angehängt wird. Verbinden Sie einen USB Stick mit dem System, während Sie die Ausgabe eines Befehls tail von der Datei /var/log/syslog überwachen. Notieren Sie den vollständigen Befehl, den Sie verwenden würden, um das Produkt, den Hersteller und die Gesamtmenge des Speichers Ihres USB Sticks zu erhalten.

    $ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer'
    Nov  8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade
    Nov  8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk
    Nov  8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)

    Natürlich ist dies nur ein Beispiel und die Ergebnisse können je nach Hersteller Ihres USB Speichersticks variieren. Beachten Sie, dass jetzt der Parameter -i mit dem Befehl grep verwendt wird, da wir nicht sicher sein können, ob die gesuchten Zeichenketten in Groß- oder Kleinbuchstaben auftauchen. Ebenfalls wurde auch der Parameter | als logisches ODER verwendet, so dass nur nach Zeilen gesucht wurde, die product ODER blocks ODER manufacturer enthalten.

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

Nächste Lektion

103.3 Grundlegende Dateiverwaltung (103.3 Lektion 1)

Nächste Lektion lesen

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

LPI ist eine Non-Profit-Organisation.

© 2023 Linux Professional Institute (LPI) ist eine globale Organisation für Zertifizierungsstandards und zur Karriereplanung für Open-Source-Profis. Mit mehr als 200.000 Zertifikatsinhabern ist es die weltweit erste und größte herstellerneutrale Linux- und Open-Source-Zertifizierungsstelle. LPI verfügt über zertifizierte Fachleute in über 180 Ländern, bietet Prüfungen in mehreren Sprachen an und hat Hunderte von Trainingspartnern.

Unser Ziel ist es, wirtschaftliche und kreative Möglichkeiten für alle zu ermöglichen, indem wir Open-Source-Wissens- und Kompetenzzertifizierungen allgemein zugänglich machen.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Kontaktieren Sie uns
  • Datenschutz und Cookie-Richtlinien

Haben Sie einen Fehler entdeckt oder möchten Sie helfen, diese Seite zu verbessern? Lassen Sie es uns wissen.

© 1999–2023 The Linux Professional Institute Inc. Alle Rechte vorbehalten.