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 |
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 |
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
-
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
undwc
können Sie anzeigen, wie viele Prozessoren Ihr System besitzt. -
Bewerkstelligen Sie dieselbe Ausgabe mit
sed
anstelle vongrep
.
-
-
Durchsuchen Sie die lokale Datei
/etc/passwd
mit den Befehlengrep
,sed
,head
undtail
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.
-
-
Betrachten Sie das Beispiel der Datei
/etc/passwd
. Kopieren Sie für diese Übung die folgenden Zeilen in eine lokale Datei namensmypasswd
.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 Siesed
, um nur das entsprechende Feld auszuwählen) aus der Dateimypasswd
auf. -
Listen Sie nur die vollständigen Namen aller Benutzer für diese Gruppe auf (verwenden Sie
sed
undcut
).
-
Offene Übungen
-
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 Befehlsed
, um alle Zeilen mit Benutzern aus dem Main Office anzeigen zu lassen, und dann eine Befehlssequenzcut
, 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. -
Wie viele Personen arbeiten in den Bereichen Finance, Engineering und Sales? (Erwägen Sie, den Befehl
uniq
einzubeziehen.) -
Nun soll eine CSV-Datei (kommagetrennte Werte) vorbereitet werden, damit aus der Datei
mypasswd
im vorherigen Beispiel die Dateinames.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
, undpaste
, um die gewünschten Ergebnisse zu erzielen. Beachten Sie, dass das Komma (,
) das Begrenzungszeichen für diese Datei ist. -
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 mittelsmd5sum
sicher? -
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. -
Wenn Sie
ls -l
im Verzeichnis/etc
benutzen, welche Ausgabe erhalten Sie? Wenn Sie den Befehlcut
auf die Ausgabe des gegebenen Befehlsls
anwenden, auf welche Vorgehensweise würden Sie nur die Dateinamen herausschneiden? Was ist mit dem Dateinamen und dem Besitzer der Dateien? Zusammen mit den Befehlenls -l
undcut
verwenden Sie auch den Befehltr
, um mehrere Leerzeichen zu einem einzelnen Leerzeichen zu reduzieren, was die Formatierung der Ausgabe mit dem Befehlcut
erleichtert. -
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 Befehlstail
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
-
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
undwc
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 vongrep
.Statt mit
grep
werden wir dies nun mitsed
versuchen:$ sed -n /processor/p /proc/cpuinfo | wc -l
Hier haben wir
sed
mit dem Parameter-n
verwendet, so dasssed
nichts ausgibt, außer dem, was mit dem Ausdruckprocessor
übereinstimmt, wie durch den Befehlp
angewiesen. Wie bei den Variante mitgrep
wirdwc -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 Befehlwc
umgeleitet wurde. Der Unterschied besteht darin, dass statt der Verwengung vonwc -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 vonsed
mit der Option-n
, mit Ausnahme des Ausdrucks, den wir explizit aufrufen, nämlich'$='
. Dieser Ausdruck weistsed
an, mit der letzten Zeile ($
) übereinzustimmen und dann diese Zeilennummer (=
) auszugeben.
-
-
Durchsuchen Sie die lokale Datei
/etc/passwd
mit den Befehlengrep
,sed
,head
undtail
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
descut
Befehls) und die Datei/etc/passwd
verwendet:
als Trennzeichen (Parameter-d:
descut
Befehls), wir leiten die Ausgabe desgrep
Befehls einfach an den entsprechendencut
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 einx
, 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 Befehlsort
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 Befehlp
angegeben wird. Das hier verwendete Dollarzeichen ($
) ist ein regulärer Ausdruck, welcher der letzten Zeile einer Datei entspricht.
-
-
Betrachten Sie das Beispiel der Datei
/etc/passwd
. Kopieren Sie für diese Übung die folgenden Zeilen in eine lokale Datei namensmypasswd
.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 Siesed
, um nur das entsprechende Feld auszuwählen) aus der Dateimypasswd
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
undcut
).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 anderencut
-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
-
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 Befehlsed
, um alle Zeilen mit Benutzern aus dem Main Office anzeigen zu lassen, und dann eine Befehlssequenzcut
, 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 Befehlssort
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, damitsed
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
-
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
weistuniq
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 Befehlsort
aushelfen. -
Nun soll eine CSV-Datei (kommagetrennte Werte) vorbereitet werden, damit aus der Datei
mypasswd
im vorigen Beispiel die Dateinames.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
undpaste
, 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
undcut
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ürtr
als auch fürpaste
. 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
-
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 mittelsmd5sum
sicher?Wenn Sie in die Handbuchseiten für
md5sum
,sha256sum
undsha512sum
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.
-
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 auchcurl
verwenden. Verwenden Sieless
, 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ßtsplit
an, dass die Dateien nummeriert werden sollen (unter Verwendung des angegebenen Suffixes). Sie könnennl
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. -
Wenn Sie
ls -l
im Verzeichnis/etc
benutzen, welche Ausgabe erhalten Sie? Wenn Sie den Befehlcut
auf die Ausgabe des gegebenen Befehlsls
anwenden, auf welche Vorgehensweise würden Sie nur die Dateinamen herausschneiden? Was ist mit dem Dateinamen und dem Besitzer der Dateien? Zusammen mit den Befehlenls -l
undcut
verwenden Sie auch den Befehltr
, um mehrere Leerzeichen zu einem einzelnen Leerzeichen zu reduzieren, was die Formatierung der Ausgabe mit dem Befehlcut
erleichtert.Der Befehl
ls
selbst gibt nur die Namen der Dateien aus. Wir können jedoch die Ausgabe mittelsls -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
weisttr
an, die wiederholten Räume zu einer einzigen Instanz eines Raumes zu schrumpfen. Der Befehltr
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
-
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 Befehlstail
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 Befehlgrep
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, dieproduct
ODERblocks
ODERmanufacturer
enthalten.