GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Arbeiten mit Datenströmen auf der Linux-Befehlszeile

Anmerkung des Autors: Ein Großteil des Inhalts in diesem Artikel ist ein Auszug aus Kapitel 3:Datenströme meines neuen Buches The Linux Philosophy for SysAdmins, mit einigen wesentlichen Änderungen, um ihn an das Artikelformat von Opensource.com anzupassen.

Alles in Linux dreht sich um Datenströme – insbesondere Textströme. Datenströme sind das Rohmaterial, auf dem die GNU-Dienstprogramme, die Kerndienstprogramme von Linux und viele andere Befehlszeilentools ihre Arbeit verrichten.

Wie der Name schon sagt, ist ein Datenstrom ein Datenstrom – insbesondere Textdaten – der mithilfe von STDIO von einer Datei, einem Gerät oder einem Programm an ein anderes weitergegeben wird. Dieses Kapitel stellt die Verwendung von Pipes vor, um Datenströme von einem Dienstprogramm zu einem anderen mit STDIO zu verbinden. Sie werden lernen, dass die Funktion dieser Programme darin besteht, die Daten auf irgendeine Weise zu transformieren. Außerdem erfahren Sie mehr über die Verwendung der Umleitung, um die Daten in eine Datei umzuleiten.

Das Linux-Terminal

  • Die 7 besten Terminalemulatoren für Linux
  • 10 Befehlszeilentools für die Datenanalyse unter Linux
  • Jetzt herunterladen:SSH-Spickzettel
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Linux-Befehlszeilen-Tutorials

Ich verwende den Begriff „transformieren“ in Verbindung mit diesen Programmen, da die primäre Aufgabe jedes einzelnen darin besteht, die eingehenden Daten von STDIO auf eine bestimmte Weise wie vom Systemadministrator beabsichtigt zu transformieren und die transformierten Daten zur möglichen Verwendung durch ein anderes Transformationsprogramm an STDOUT zu senden oder Umleitung zu einer Datei.

Der Standardbegriff „Filter“ impliziert etwas, womit ich nicht einverstanden bin. Per Definition ist ein Filter ein Gerät oder ein Werkzeug, das etwas entfernt, wie z. B. ein Luftfilter luftgetragene Verunreinigungen entfernt, damit sich der Verbrennungsmotor Ihres Autos nicht an diesen Partikeln zu Tode reibt. In meinem Chemieunterricht an der High School und am College wurde Filterpapier verwendet, um Partikel aus einer Flüssigkeit zu entfernen. Der Luftfilter in meinem HLK-System zu Hause entfernt Partikel, die ich nicht einatmen möchte.

Obwohl sie manchmal unerwünschte Daten aus einem Stream herausfiltern, bevorzuge ich den Begriff „Transformer“, da diese Dienstprogramme so viel mehr leisten. Sie können Daten zu einem Stream hinzufügen, die Daten auf erstaunliche Weise ändern, sie sortieren, die Daten in jeder Zeile neu anordnen, Operationen basierend auf dem Inhalt des Datenstroms ausführen und vieles mehr. Fühlen Sie sich frei, den Begriff zu verwenden, den Sie bevorzugen, aber ich bevorzuge Transformatoren. Ich erwarte, dass ich damit allein bin.

Datenströme können manipuliert werden, indem Transformer mithilfe von Pipes in den Stream eingefügt werden. Jedes Transformer-Programm wird vom Systemadministrator verwendet, um einige Operationen an den Daten im Stream durchzuführen und so seinen Inhalt auf irgendeine Weise zu ändern. Am Ende der Pipeline kann dann eine Umleitung verwendet werden, um den Datenstrom in eine Datei zu leiten. Wie bereits erwähnt, könnte diese Datei eine tatsächliche Datendatei auf der Festplatte oder eine Gerätedatei wie eine Laufwerkspartition, ein Drucker, ein Terminal, ein Pseudo-Terminal oder ein anderes an einen Computer angeschlossenes Gerät sein.

Die Fähigkeit, diese Datenströme mit diesen kleinen, aber leistungsstarken Transformationsprogrammen zu manipulieren, ist für die Leistungsfähigkeit der Linux-Befehlszeilenschnittstelle von zentraler Bedeutung. Viele der wichtigsten Dienstprogramme sind Transformer-Programme und verwenden STDIO.

In der Unix- und Linux-Welt ist ein Stream ein Fluss von Textdaten, der aus einer Quelle stammt; Der Stream kann zu einem oder mehreren Programmen fließen, die ihn auf irgendeine Weise umwandeln, und dann kann er in einer Datei gespeichert oder in einer Terminalsitzung angezeigt werden. Als Systemadministrator ist Ihr Job eng mit der Manipulation der Erstellung und des Flusses dieser Datenströme verbunden. In diesem Beitrag werden wir Datenströme untersuchen – was sie sind, wie man sie erstellt und ein wenig darüber, wie man sie verwendet.

Textstreams – eine universelle Schnittstelle

Die Verwendung von Standard Input/Output (STDIO) für die Programmeingabe und -ausgabe ist eine wichtige Grundlage der Linux-Methode. STDIO wurde zuerst für Unix entwickelt und hat seitdem seinen Weg in die meisten anderen Betriebssysteme gefunden, einschließlich DOS, Windows und Linux.

Dies ist die Unix-Philosophie:Schreiben Sie Programme, die eine Sache tun und es gut machen. Schreiben Sie Programme, um zusammenzuarbeiten. Schreiben Sie Programme zur Verarbeitung von Textströmen, denn das ist eine universelle Schnittstelle.“

— Doug McIlroy, Grundlagen der Unix-Philosophie

STDIO

STDIO wurde von Ken Thompson als Teil der Infrastruktur entwickelt, die zum Implementieren von Pipes in frühen Versionen von Unix erforderlich ist. Programme, die STDIO implementieren, verwenden standardisierte Dateihandles für die Ein- und Ausgabe und nicht Dateien, die auf einer Festplatte oder anderen Aufzeichnungsmedien gespeichert sind. STDIO lässt sich am besten als gepufferter Datenstrom beschreiben, und seine Hauptfunktion besteht darin, Daten vom Ausgang eines Programms, einer Datei oder eines Geräts zum Eingang eines anderen Programms, einer anderen Datei oder eines anderen Geräts zu streamen.

Es gibt drei STDIO-Datenströme, von denen jeder beim Start eines Programms automatisch als Datei geöffnet wird – nun ja, der Programme, die STDIO verwenden. Jeder STDIO-Datenstrom ist mit einem Datei-Handle verknüpft, bei dem es sich lediglich um eine Reihe von Metadaten handelt, die die Attribute der Datei beschreiben. Die Datei-Handles 0, 1 und 2 sind explizit durch Konvention und lange Praxis als STDIN, STDOUT bzw. STDERR definiert.

STDIN, Dateihandle 0 , ist eine Standardeingabe, die normalerweise über die Tastatur eingegeben wird. STDIN kann von jeder Datei, einschließlich Gerätedateien, anstelle der Tastatur umgeleitet werden. Es ist nicht üblich, STDIN umzuleiten, aber es ist möglich.

STDOUT, Dateihandle 1 , ist eine Standardausgabe, die den Datenstrom standardmäßig an das Display sendet. Es ist üblich, STDOUT in eine Datei umzuleiten oder es zur weiteren Verarbeitung an ein anderes Programm weiterzuleiten.

STDERR, Dateihandle 2 . Der Datenstrom für STDERR wird normalerweise auch an das Display gesendet.

Wenn STDOUT in eine Datei umgeleitet wird, wird weiterhin STDERR auf dem Bildschirm angezeigt. Dies stellt sicher, dass STDERR angezeigt wird, wenn der Datenstrom selbst nicht auf dem Terminal angezeigt wird, wodurch sichergestellt wird, dass der Benutzer alle Fehler sieht, die sich aus der Ausführung des Programms ergeben. STDERR kann auch dorthin umgeleitet oder an das nächste Transformer-Programm in einer Pipeline weitergegeben werden.

STDIO ist als C-Bibliothek implementiert, stdio.h , der in den Quellcode von Programmen aufgenommen werden kann, damit er in die resultierende ausführbare Datei kompiliert werden kann.

Einfache Streams

Sie können die folgenden Experimente sicher in /tmp durchführen Verzeichnis Ihres Linux-Hosts. Erstellen Sie als Root-Benutzer /tmp das PWD, erstellen Sie ein Testverzeichnis und machen Sie dann das neue Verzeichnis zum PWD.

# cd /tmp ; mkdir test ; cd test 

Geben Sie das folgende Befehlszeilenprogramm ein und führen Sie es aus, um einige Dateien mit Inhalt auf dem Laufwerk zu erstellen. Wir verwenden den dmesg Befehl einfach, um Daten für die Dateien bereitzustellen, die enthalten sein sollen. Der Inhalt spielt keine Rolle, sondern nur die Tatsache, dass jede Datei einen Inhalt hat.

# for I in 0 1 2 3 4 5 6 7 8 9 ; do dmesg > file$I.txt ; done  

Stellen Sie sicher, dass sich jetzt mindestens 10 Dateien in /tmp/ befinden mit den Namen file0.txt durch file9.txt .

# ll
insgesamt 1320
-rw-r--r-- 1 root root 131402 17. Oktober 15:50 file0.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file1.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file2.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file3.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file4.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file5.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file6.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file7.txt
-rw-r--r-- 1 root root 131402 17. Okt. 15:50 file8.txt
-rw-r--r-- 1 root root 131402 17. Oktober 15:50 file9.txt

Wir haben Datenströme mit dem dmesg generiert Befehl, der zu einer Reihe von Dateien umgeleitet wurde. Die meisten Kerndienstprogramme verwenden STDIO als Ausgabestrom, und diejenigen, die Datenströme generieren, anstatt den Datenstrom in irgendeiner Weise umzuwandeln, können verwendet werden, um die Datenströme zu erstellen, die wir für unsere Experimente verwenden werden. Datenströme können so kurz wie eine Zeile oder sogar ein einzelnes Zeichen und so lang wie nötig sein.

Durchsuchen der Festplatte

Jetzt ist es an der Zeit, ein wenig auf Erkundungstour zu gehen. In diesem Experiment werden wir uns einige der Dateisystemstrukturen ansehen.

Beginnen wir mit etwas Einfachem. Sie sollten mit dd zumindest einigermaßen vertraut sein Befehl. Offiziell als „Festplattenauszug“ bekannt, nennen ihn viele Systemadministratoren aus gutem Grund „Festplattenzerstörer“. Viele von uns haben versehentlich den Inhalt einer ganzen Festplatte oder Partition mit dem dd zerstört Befehl. Deshalb werden wir uns im /tmp/test aufhalten Verzeichnis, um einige dieser Experimente durchzuführen.

Trotz seines guten Rufs ist dd kann beim Erkunden verschiedener Arten von Speichermedien, Festplatten und Partitionen sehr nützlich sein. Wir werden es auch als Werkzeug verwenden, um andere Aspekte von Linux zu erkunden.

Melden Sie sich als root bei einer Terminalsitzung an, falls Sie dies noch nicht sind. Wir müssen zuerst die spezielle Gerätedatei für Ihre Festplatte mit lsblk ermitteln Befehl.

 [root @ studentvm1 test] # LsBlk -i 0 Teil /boot
`-sda2                                 8:2    0   59G  0 Teil
  |-fedora_studentvm1-pool00_tmeta   253:0    0    4M  0 lvm  
  | `-fedora_studentvm1-pool00-tpool 253:2    0    2G  0 lvm  
  | |-fedora_studentvm1-root       253:3    0    2G  0 lvm  /
  | `-fedora_studentvm1-pool00     253:6    0    2G  0 lvm  
  |-fedora_studentvm1-pool00_tdata   253:1    0    2G  0 lvm  
  | `-fedora_studentvm1-pool00-tpool 253:2    0    2G  0 lvm  
  | |-fedora_studentvm1-root       253:3    0    2G  0 lvm  /
  | `-fedora_studentvm1-pool00 253:6 0 2G 0 LVM
| -Fedora_studentvm1-Swap 253:4 0 10G 0 LVM [Swap]
| -fedora_studentvm1-usr 253:5 0 15g 0 lvm / usr
lvm  /tmp
sr0                                                   11:0    1 1024M  0 rom

Daraus können wir ersehen, dass es auf diesem Host nur eine Festplatte gibt, und dass die zugehörige spezielle Gerätedatei /dev/sda ist , und dass es zwei Partitionen hat. Die Datei /dev/sda1 Partition ist die Boot-Partition und die /dev/sda2 Partition enthält eine Volume-Gruppe, auf der die restlichen logischen Volumes des Hosts erstellt wurden.

Verwenden Sie als root in der Terminalsitzung den dd Befehl, um den Startdatensatz der Festplatte anzuzeigen, vorausgesetzt, er ist /dev/sda zugewiesen Gerät. Das bs= Argument ist nicht das, was Sie vielleicht denken; es gibt einfach die Blockgröße und den count= an Das Argument gibt die Anzahl der Blöcke an, die in STDIO ausgegeben werden sollen. Der if= Das Argument gibt die Quelle des Datenstroms an, in diesem Fall /dev/sda Gerät. Beachten Sie, dass wir nicht den ersten Block der Partition betrachten, sondern den allerersten Block der Festplatte.

[root@studentvm1 test]# dd if=/dev/sda bs=512 count=1
�c�#�м���؎���|�#�#���!# ��8#u
                            ��#���u��#�#�#�|���t#�L#�#�|���#�����€t�� pt#���y|1��؎м ��d|<�t#��R�|1��D#@�D��D#�##f�#\|f�f�#`| f�\
                                      �D#p�B�#r�p�#�K`#�#��1��������#a`���#f��u#� ���f1�f�TCPAf�#f�#a�&Z|�#}�#�.}�4�3}�.�#��GRUB GeomHard DiskRead Error
�#��#� 1+0 Datensätze aus
512 Bytes kopiert, 4.3856e-05 s, 11.7 MB/s

Dadurch wird der Text des Boot-Datensatzes gedruckt, der der erste Block auf der Festplatte ist – jeder Festplatte. In diesem Fall gibt es Informationen über das Dateisystem und, obwohl es nicht lesbar ist, weil es im Binärformat gespeichert ist, die Partitionstabelle. Wenn dies ein bootfähiges Gerät wäre, würde sich Stufe 1 von GRUB oder einem anderen Bootloader in diesem Sektor befinden. Die letzten drei Zeilen enthalten Daten über die Anzahl der verarbeiteten Datensätze und Bytes.

Beginnend mit dem Anfang von /dev/sda1 , schauen wir uns jeweils ein paar Datenblöcke an, um herauszufinden, was wir wollen. Der Befehl ähnelt dem vorherigen, außer dass wir einige weitere Datenblöcke zur Ansicht angegeben haben. Möglicherweise müssen Sie weniger Blöcke angeben, wenn Ihr Terminal nicht groß genug ist, um alle Daten gleichzeitig anzuzeigen, oder Sie können die Daten durch das kleinere Dienstprogramm leiten und damit durch die Daten blättern – beide Wege funktionieren. Denken Sie daran, dass wir dies alles als Root-Benutzer tun, da Nicht-Root-Benutzer nicht über die erforderlichen Berechtigungen verfügen.

Geben Sie den gleichen Befehl wie im vorherigen Experiment ein, aber erhöhen Sie die Anzahl der anzuzeigenden Blöcke auf 100, wie unten gezeigt, um mehr Daten anzuzeigen.

[root@studentvm1 test]# dd if=/dev/sda1 bs=512 count=100
##33��#:�##�� :o�[:o�[#�� S�###�q[#
                                  #<�#{5OZh�GJ͞#t�Ұ##boot/bootysimage/booC�dp��G'�*)�#A�##@
     #�q[
�## ##  ###�#���To=###<#8���#'#�###�#�����#� '  �����#Xi  �#��`  qT���
  <���
      �  r����  ]�#�#�##�##�##� #�##�##�##�#�##�##�#��#�#�##�#�##�##�#��#�#����#       �     � #    �#    �#

�#
�#
�#
  �
   �#
     �#
       � #
         �
          �#
            �#
              �#100+0 Datensätze ein
100+0 Datensätze aus
51200 Bytes (51 kB, 50 KiB ) kopiert, 0,00117615 s, 43,5 MB/s

Versuchen Sie nun diesen Befehl. Ich werde hier nicht den gesamten Datenstrom wiedergeben, da dies sehr viel Platz beanspruchen würde. Verwenden Sie Strg-C auszubrechen und den Datenstrom zu stoppen.

[root@studentvm1 test]# dd if=/dev/sda 

Dieser Befehl erzeugt einen Datenstrom, der den vollständigen Inhalt der Festplatte /dev/sda darstellt , einschließlich des Startdatensatzes, der Partitionstabelle und aller Partitionen und ihres Inhalts. Diese Daten könnten in eine Datei umgeleitet werden, um sie als vollständige Sicherung zu verwenden, von der aus eine Bare-Metal-Wiederherstellung durchgeführt werden kann. Es könnte auch direkt an eine andere Festplatte gesendet werden, um die erste zu klonen. Aber führen Sie dieses spezielle Experiment nicht durch.

[root@studentvm1 test]# dd if=/dev/sda of=/dev/sdx 

Sie können sehen, dass der dd Der Befehl kann sehr nützlich sein, um die Strukturen verschiedener Arten von Dateisystemen zu untersuchen, Daten auf einem defekten Speichergerät zu lokalisieren und vieles mehr. Es erzeugt auch einen Datenstrom, den wir mithilfe der Transformator-Dienstprogramme ändern oder anzeigen können.

Der eigentliche Punkt hier ist, dass dd erzeugt wie so viele Linux-Befehle einen Datenstrom als Ausgabe. Dieser Datenstrom kann mit anderen Tools auf vielfältige Weise durchsucht und manipuliert werden. Es kann sogar für geisterhafte Backups oder Festplattenduplizierung verwendet werden.

Zufälligkeit

Es stellt sich heraus, dass Zufälligkeit bei Computern wünschenswert ist – wer hätte das gedacht? Es gibt eine Reihe von Gründen, warum Systemadministratoren einen Strom zufälliger Daten generieren möchten. Ein Strom zufälliger Daten ist manchmal nützlich, um den Inhalt einer kompletten Partition zu überschreiben, wie z. B. /dev/sda1 , oder sogar die gesamte Festplatte, wie in /dev/sda .

Führen Sie dieses Experiment als Nicht-Root-Benutzer durch. Geben Sie diesen Befehl ein, um einen endlosen Strom zufälliger Daten an STDIO zu drucken.

[student@studentvm1 ~]$ cat /dev/urandom 

Verwenden Sie Strg-C auszubrechen und den Datenstrom zu stoppen. Möglicherweise müssen Sie Strg-C verwenden mehrmals.

Zufallsdaten werden auch als Eingabequelle für Programme verwendet, die zufällige Passwörter und zufällige Daten und Zahlen zur Verwendung in wissenschaftlichen und statistischen Berechnungen generieren. Ich werde Zufälligkeit und andere interessante Datenquellen etwas ausführlicher in Kapitel 24 behandeln:Alles ist eine Datei.

Pfeifenträume

Pipes sind entscheidend für unsere Fähigkeit, die erstaunlichen Dinge auf der Befehlszeile zu tun, so sehr, dass ich denke, dass es wichtig ist zu erkennen, dass sie von Douglas McIlroy in den frühen Tagen von Unix erfunden wurden (danke, Doug!). Die Website der Princeton University enthält ein Fragment eines Interviews mit McIlroy, in dem er die Entstehung der Pipe und die Anfänge der Unix-Philosophie diskutiert.

Beachten Sie die Verwendung von Pipes in dem als nächstes gezeigten einfachen Befehlszeilenprogramm, das jeden angemeldeten Benutzer einmal auflistet, unabhängig davon, wie viele Anmeldungen er aktiv hat. Führen Sie dieses Experiment als studentischer Benutzer durch. Geben Sie den unten gezeigten Befehl ein:

[student@studentvm1 ~]$ w | Schwanz -n +3 | awk '{print $1}' | sortieren | uniq
root
student
[student@studentvm1 ~]$

Die Ergebnisse dieses Befehls erzeugen zwei Datenzeilen, die zeigen, dass sowohl root als auch student des Benutzers angemeldet sind. Es zeigt nicht, wie oft jeder Benutzer angemeldet ist. Ihre Ergebnisse werden sich mit ziemlicher Sicherheit von meinen unterscheiden.

Pipes – dargestellt durch den vertikalen Balken ( | ) – sind der syntaktische Klebstoff, der Operator, der diese Befehlszeilenprogramme miteinander verbindet. Pipes ermöglichen es, die Standardausgabe eines Befehls „zu leiten“, d. h. von der Standardausgabe eines Befehls zur Standardeingabe des nächsten Befehls zu streamen.

Der Operator |&kann verwendet werden, um STDERR zusammen mit STDOUT an STDIN des nächsten Befehls weiterzuleiten. Dies ist nicht immer wünschenswert, bietet jedoch Flexibilität bei der Möglichkeit, den STDERR-Datenstrom zum Zweck der Problembestimmung aufzuzeichnen.

Eine Reihe von Programmen, die mit Pipes verbunden sind, wird als Pipeline bezeichnet, und die Programme, die STDIO verwenden, werden offiziell als Filter bezeichnet, aber ich bevorzuge den Begriff „Transformatoren“.

Überlegen Sie, wie dieses Programm funktionieren müsste, wenn wir den Datenstrom nicht von einem Befehl zum nächsten leiten könnten. Der erste Befehl würde seine Aufgabe für die Daten ausführen und dann müsste die Ausgabe dieses Befehls in einer Datei gespeichert werden. Der nächste Befehl müsste den Datenstrom aus der Zwischendatei lesen und seine Modifikation des Datenstroms durchführen, indem er seine eigene Ausgabe an eine neue, temporäre Datendatei sendet. Der dritte Befehl müsste seine Daten aus der zweiten temporären Datendatei nehmen und seine eigene Manipulation des Datenstroms durchführen und dann den resultierenden Datenstrom in noch einer weiteren temporären Datei speichern. Bei jedem Schritt müssten die Datendateinamen auf irgendeine Weise von einem Befehl zum nächsten übertragen werden.

Daran kann ich gar nicht denken, weil es so komplex ist. Denken Sie daran:Einfachheit rockt!

Pipelines bauen

Wenn ich etwas Neues mache, ein neues Problem löse, tippe ich normalerweise nicht einfach eine komplette Bash-Befehlspipeline von Grund auf neu ein. Normalerweise beginne ich mit nur einem oder zwei Befehlen in der Pipeline und baue von dort aus auf, indem ich weitere Befehle hinzufüge, um den Datenstrom weiter zu verarbeiten. Dadurch kann ich den Status des Datenstroms nach jedem der Befehle in der Pipeline anzeigen und bei Bedarf Korrekturen vornehmen.

Es ist möglich, sehr komplexe Pipelines aufzubauen, die den Datenstrom mit vielen verschiedenen Dienstprogrammen transformieren können, die mit STDIO funktionieren.

Weiterleitung

Umleitung ist die Fähigkeit, den STDOUT-Datenstrom eines Programms in eine Datei statt auf das Standardziel der Anzeige umzuleiten. Das Zeichen „größer als“ (> ), auch bekannt als „gt“, ist das syntaktische Symbol für die Umleitung von STDOUT.

Das Umleiten des STDOUT eines Befehls kann verwendet werden, um eine Datei zu erstellen, die die Ergebnisse dieses Befehls enthält.

[student@studentvm1 ~]$ df -h > diskusage.txt 

Dieser Befehl gibt keine Ausgabe an das Terminal aus, es sei denn, es liegt ein Fehler vor. Dies liegt daran, dass der STDOUT-Datenstrom an die Datei umgeleitet wird und STDERR weiterhin an das STDOUT-Gerät, das die Anzeige ist, geleitet wird. Sie können den Inhalt der Datei, die Sie gerade erstellt haben, mit diesem nächsten Befehl anzeigen:

 [Student @ studentvm1 test] # cat discuSage.txt 
Dateisystemgröße Gebraucht Gebrauchsnutzung% montiert auf
devtmpfs 2.0g 0 2.0g 0% / dev
TMPFS 2.0G 0 2.0g 0% / dev / shm
TMPFS 2.0G 1,2 m 2,0 g 1% / Lauf
TMPFS 2.0G 0 2.0G 0% / SYS / FS / CGROUP
/ dev / capper / fedora_studentvm1- root  2.0G   50M  1.8G   3% /
/dev/mapper/fedora_studentvm1-usr    15G  4.5G  9.5G  33% /usr
/dev/mapper/fedora_studentvm1-var   9.8G  1.1G  8.2G  12% /var
/dev/mapper/fedora_studentvm1-tmp   4.9G   21M  4.6G   1% /tmp
/dev/mapper/fedora_studentvm1-home  2.0G  7.2M  1.8G   1% /home
/ dev / sda1 976m 221m 689m 25% / boot
TMPFS 395m 0 395m 0% / Lauf / Benutzer / 0
TMPFS 395M 12K 395m 1% / Lauf / Benutzer / 1000

Bei Verwendung des Symbols> zum Umleiten des Datenstroms wird die angegebene Datei erstellt, falls sie noch nicht vorhanden ist. Falls vorhanden, wird der Inhalt durch den Datenstrom des Befehls überschrieben. Sie können doppelte Größer-als-Symbole>> verwenden, um den neuen Datenstrom an jeden vorhandenen Inhalt in der Datei anzuhängen.

[student@studentvm1 ~]$ df -h >> diskusage.txt 

Sie können cat verwenden und/oder less um die diskusage.txt anzuzeigen Datei, um zu überprüfen, ob die neuen Daten an das Ende der Datei angehängt wurden.

Das Symbol <(kleiner als) leitet Daten an die STDIN des Programms um. Möglicherweise möchten Sie diese Methode verwenden, um Daten aus einer Datei in STDIN eines Befehls einzugeben, der keinen Dateinamen als Argument akzeptiert, aber STDIN verwendet. Obwohl Eingabequellen an STDIN umgeleitet werden können, wie z. B. eine Datei, die als Eingabe für grep verwendet wird, ist dies im Allgemeinen nicht erforderlich, da grep auch einen Dateinamen als Argument zur Angabe der Eingabequelle akzeptiert. Die meisten anderen Befehle nehmen auch einen Dateinamen als Argument für ihre Eingabequelle.

Nur herumgrübeln

Das grep Der Befehl wird verwendet, um Zeilen auszuwählen, die einem bestimmten Muster aus einem Datenstrom entsprechen. grep ist eines der am häufigsten verwendeten Transformator-Dienstprogramme und kann auf sehr kreative und interessante Weise verwendet werden. Das grep Der Befehl ist einer der wenigen, der korrekt als Filter bezeichnet werden kann, da er alle Zeilen des Datenstroms herausfiltert, die Sie nicht möchten. es verbleiben nur die gewünschten Zeilen im verbleibenden Datenstrom.

Wenn das PWD nicht /tmp/test ist Verzeichnis, machen Sie es so. Lassen Sie uns zuerst einen Strom zufälliger Daten erstellen, die in einer Datei gespeichert werden. In diesem Fall möchten wir etwas weniger zufällige Daten, die auf druckbare Zeichen beschränkt wären. Ein gutes Passwort-Generator-Programm kann dies tun. Das folgende Programm (möglicherweise müssen Sie pwgen installieren falls noch nicht geschehen) erstellt eine Datei, die 50.000 Passwörter enthält, die 80 Zeichen lang sind und alle druckbaren Zeichen verwenden. Probieren Sie es aus, ohne zur random.txt umzuleiten Datei, um zu sehen, wie das aussieht, und leite dann einmal den Ausgabedatenstrom in die Datei um.

$ pwgen -sy 80 50000 > random.txt 

In Anbetracht dessen, dass es so viele Passwörter gibt, ist es sehr wahrscheinlich, dass einige Zeichenfolgen darin gleich sind. Zuerst cat die random.txt Datei, dann verwenden Sie grep Befehl, um einige kurze, zufällig ausgewählte Zeichenfolgen aus den letzten zehn Passwörtern auf dem Bildschirm zu finden. Ich habe das Wort „see“ in einem dieser zehn Passwörter gesehen, also sah mein Befehl so aus:grep see random.txt , und Sie können das versuchen, aber Sie sollten auch selbst einige Saiten auswählen, um dies zu überprüfen. Kurze Zeichenfolgen mit zwei bis vier Zeichen funktionieren am besten.

$ grep siehe random.txt 
        R=p)'s/~0}wr~2(OqaL.S7DNyxlmO69`"12u]h@rp[D2%3}1b87+>Vk,;4a0hX]d7see;1%9|wMp6Yl.
        bSM_mt_hPy|YZ1NU@[;zV2-see)>(BSK~n5mmb9~h) yx{a&$_e
        cjR1QWZwEgl48[3i-(^x9D=v)seeYT2R#M:>wDh?Tn$]HZU7}j!7bIiIr^cI.DI)W0D"'[email protected]
z=tXcjVv^G\nW`,y=bED]d|7%s6iYT^a^Bvsee:v\UmWT02|P|nq%A*;+Ng[$S%*s)-ls"dUfo|0P5+ n

Zusammenfassung

Es ist die Verwendung von Pipes und Redirection, die viele der erstaunlichen und leistungsstarken Aufgaben ermöglicht, die mit Datenströmen auf der Linux-Befehlszeile ausgeführt werden können. Es sind Pipes, die STDIO-Datenströme von einem Programm oder einer Datei zu einem anderen transportieren. Die Möglichkeit, Datenströme durch ein oder mehrere Transformer-Programme zu leiten, unterstützt eine leistungsstarke und flexible Bearbeitung von Daten in diesen Streams.

Jedes der Programme in den in den Experimenten demonstrierten Pipelines ist klein, und jedes macht eine Sache gut. Sie sind auch Transformatoren; Das heißt, sie nehmen die Standardeingabe, verarbeiten sie auf irgendeine Weise und senden das Ergebnis dann an die Standardausgabe. Die Implementierung dieser Programme als Transformer, um verarbeitete Datenströme von ihrer eigenen Standardausgabe an die Standardeingabe der anderen Programme zu senden, ist komplementär und notwendig für die Implementierung von Pipes als Linux-Tool.

STDIO ist nichts anderes als Datenströme. Diese Daten können fast alles sein, von der Ausgabe eines Befehls zum Auflisten der Dateien in einem Verzeichnis bis hin zu einem endlosen Datenstrom von einem speziellen Gerät wie /dev/urandom , oder sogar ein Stream, der alle Rohdaten einer Festplatte oder einer Partition enthält.

Jedes Gerät auf einem Linux-Computer kann wie ein Datenstrom behandelt werden. Sie können gewöhnliche Tools wie dd verwenden und cat Daten von einem Gerät in einen STDIO-Datenstrom auszugeben, der mit anderen gewöhnlichen Linux-Tools verarbeitet werden kann.


Linux
  1. Planen von Aufgaben mit dem Linux-Cron-Befehl

  2. Planen Sie eine Aufgabe mit dem Linux-Befehl at

  3. Generieren Sie Passwörter auf der Linux-Befehlszeile

  4. 8 Tipps für die Linux-Kommandozeile

  5. Überwachen des Mikrofonpegels mit einem Befehlszeilentool unter Linux

So prüfen Sie die Rechtschreibung auf der Linux-Befehlszeile mit Aspell

Linux-awk-Befehl mit 10 Beispielen

Meistern Sie die Linux-Befehlszeile

So zeigen Sie Daten mit dem Tail-Befehl in Linux an

Arbeiten mit Docker-Images über die Befehlszeile

Grundlagen der Linux-Befehlszeile – Arbeiten mit Dateien und Verzeichnissen