Donnerstag, 13. Oktober 2016

103.7 Textdateien mit regulären Ausdrücken durchsuchen - grep, egrep und fgrep

grep


  • Zeilen einer Datei nach regulären Ausdrücken (oder auch ganze Wörter) untersuchen
  • Ausgabe erfolgt über stdout
  • nimmt keine Änderungen an der Datei selbst vor (im Gegensatz zu sed)
  • sinngemäße Übersetzung von grep -> Global search for Regular Exressions and Print out
  • wichtigste Optionen von grep
    • -v    invertiert die Ausgabe; Ausgabe der Zeilen, auf die der gesuchte Ausdruck NICHT zutrifft
    • -n    dem Suchergebnis eine Zeilennummerierung hinzufügen
    • -E    Verwendung der erweiterten regexp -> verhält sich dann wie egrep (siehe unten)
    • -c    zählt nur die Übereinstimmungen mit dem Suchmuster
    • -i    ignoriert Groß- und Kleinschreibung
Beispiele der Verwendung von grep:

  • :~# grep Willi Adressliste
    Sucht in der Datei Adressliste nach Zeilen, die das Wort Willi enhalten
  • :~# grep [Ww]ill[iy] Adressliste
    mögliche Ergebnisse des Suchmusters: Willy, willy, Willi, willi; Jede Klammergruppe ersetzt genau ein Zeichen
  • :~# grep -i will[iy] Adressliste
    -i ignoriert die Groß- und Kleinschreibung, daher ist auch das Ergebnis wiLLy zum Beispiel möglich
  • :~# grep W.illi Adressliste
    Suchmuster würde auch auf Ausdrücke wie Wolli oder Wqilli zutreffen
  • :~# grep [#] /etc/config.conf
    Alle Zeilen finden, die eine Raute enthalten (# am Anfang einer Zeile kennzeichnen unter Linux eigentlich fast immer Kommentare)
  • :~# grep -v [#] /etc/config.conf
    Invertiert das Ergebnis im Beispiel darüber, jedoch würden hier auch die Zeilen nicht angezeigt werden, die eine Raute innerhalb der Zeile enthalten und nicht nur am Anfang der Zeile (u.U. also auch die Code-Zeilen)
  • :~# grep [^#] /etc/config.conf
    Dieser Suchausdruck findet alle Zeichen, die NICHT mit einer Raute beginnen. In meinem Beispiel hatte dies zur Folge, dass die ganze Datei ausgegeben wurde
  • :~# grep -v ^[#] /etc/config.conf           :~# grep ^[^#] /etc/config.conf
    Beide Kommandos geben nur Zeilen aus, die am Anfang der Zeile keine Raute enthalten
  • :~# grep -v ^[#] /etc/config.conf | grep -v ^$ oder :~# grep ^[^#] /etc/config.conf | grep ^$
    Mit Hilfe der pipe auf ein zusätzliches grep werden die Leerzeilen aus der Ausgabe herausgefiltert (Leerzeile besteht nur aus ^ (Zeilenanfang) und $ (Zeilenende))
  • :~# grep 'Wort[1-9]*\>' Suchdatei
    enthält eine Zeichenkette, die entweder nur "Wort" enthält oder "Wort" mit einer beliebigen Anzahl (*) von Zahlen im Anschluss, aber am Wortende (\>). z.B. Wort1, Wort23, Wort2489
  • :~# grep 'Wort[1-9]\?\>' Suchdatei
    hier wird Wort nur in Verbindung mit EINER Zahl am Wortende oder ohne Zahl als Suchergebnis gelistet. Z.B Wort, Wort1, Wort2...
  • :~# grep '^Dec 10' /var/log/messages
    Alle Einträge zu einem bestimmten Datum suchen
  • :~# grep '1\{3,5\}' Suchdatei
    {3,5} grenzt die Anzahl der Wiederholungen ein. Dabei müssen die geschweiften Klammern jeweils durch einen Backslash vor Interpretation geschützt werden. Im Ergebnis würden alle Zeilen ausgegeben werden, wo 3,[A4 oder 5 Einsen aufeinander folgendend auftauchen
  • :~# grep '1\{3,\}' Suchdatei
    Mindestens 3 Wiederholungen, aber keine Maximalanzahl von Wiederholungen.
  • :~# grep '[0-9]\{3\}' Suchdatei
    sucht Zeilen, die 3 aufeinander folgende Ziffern enthalten
  • :~# grep '[A-Z]\{3\}' Suchdatei
    sucht Zeilen mit 3 aufeinander folgenden Großbuchstaben
  • :~# grep '\$ [0-9]\{3,\}\>' Suchdatei
    sucht nach mindestens dreistelligen Dollarbeträgen, siehe auch Erläuterung zu Metazeichen unten
  • :~# grep '\/var\/log\/' Suchdatei
    Wenn z.B. nach Dateipfaden in einer Datei gesucht wird, müssen die Slashes ebenfalls durch einen Backslash geschützt werden.
  • :~# grep 'c:\\windows\\system32\\' Suchdatei
    das Gleiche gilt sinngemäß auch für Windowsverzeichnisse
  • :~# grep '[A-Z]\+' Suchdatei
    Hier wird nach Zeilen gesucht, die mindestens einen Großbuchstaben enthalten
  • Einige Metazeichen müssen durch einen Backslash geschützt werden, damit grep sie nicht als Bestandteil des Suchmusters sieht. Es handelt sich hierbei um ?, +, {, }, |, ( und). Genauso müssen Metazeichen auch mit einem Backslash geschützt werden, wenn sie Bestandteil des Suchmusters sein sollen (z.B. das $ Zeichen, wenn es als Währungssymbol verstanden werden soll)

egrep und fgrep

  • egrep (extended) und fgrep  (fixed) waren ursprünglich Varianten von grep mit Zusatzfähigkeiten
  • Heute nicht mehr notwendig, da grep die zusätzlichen Funktionen zwischenzeitlich im Bauch hat
  • grep -E     entspricht egrep
  • grep -F     entspricht fgrep
  • ältere Skripte verwenden diese Programme noch
  • egrep unterstützt einen erweiterten Satz Metazeichen. Entsprechend wird bei der Suche auch mehr Rechenzeit benötigt
  • bei fgrep im Gegensatz werden Metazeichen im Suchmuster als normale Zeichen interpretiert
  • weitere Varianten: agrep für fehlertolerantes Suchen und zgrep für die Suche in komprimierten Archiven (beide sind NICHT prüfungsrelevant)  

Dienstag, 11. Oktober 2016

103.7 Textdateien mit regulären Ausdrücken durchsuchen - Metazeichen

Wichtung 2

reguläre Ausdrücke - regular expression - regexp - regex

In der Prüfung werden die regulären Ausdrücke ausschließlich in Verbindung mit sed, grep und vi verwendet.

Es gibt natürlich viele andere Programme, die ebenfalls mit regulären Ausdrücken arbeiten, z.B. Python, awk, gawk oder Perl

Was sind reguläre Ausdrücke?


  • ein regulärer Ausdruck kann als eine Art Beschreibungssprache verstanden werden
  • hier werden Suchmuster verwendet, z.B. ein Suchwort, eine Position im Text oder auch Wildcards
  • Nicht alle Programme interpretieren reguläre Ausdrücke gleich!!!

Die Metazeichen - allgemeine Grundlagen



  • ^  Textanker für den Zeilenanfang
  • $  Textanker für das Zeilenende
  • \< markiert einen Wortanfang
  • \> markiert ein Wortende
  • \   schützt ein Zeichen vor der Interpretation (wenn man z.B. das $ Zeichen suchen möchte)
  • [] der Ausdruck passt auf die in den Klammern enthaltenen Zeichen, ersetzt aber immer nur EIN Zeichen
  • [^Zeichen] der Ausdruck passt nicht auf die in den Klammern enthaltenen Zeichen
    Unbedingt beachten, dass der Zirkumflex INNERHALB der Klammern sitzt, außerhalb markiert er den Zeilenanfang
^[^#] => erzielt einen Treffer, wenn am Zeilenanfang keine Raute zu finden ist!!! 

Wildcards


  • *  null oder beliebig viele Wiederholungen des voranstehenden Zeichens
  • ?  null oder eine einmalige Wiederholung
  • +  mindestens einmaliges Vorkommen
  • .  (Punkt) kann als Platzhalter für ein beliebiges Zeichen (außer Zeilenvorschub) verwendet werden
In der Shell ersetzt der Stern * mehrere beliebige Zeichen und das Fragezeichen ? nur ein beliebiges Zeichen!!!

:/bin # ls g*
gawk    getkeycodes    grep   gunzip ....

:/bin # ls g???
gawk    grep    gzip




Dienstag, 4. Oktober 2016

103.6 Prozess-Ausführungsprioritäten ändern

Wichtung 2

Änderung der Prozesspriorität kann manchmal notwendig werden. Dabei kann es nötig sein die Priorität zu erhöhen oder zu senken, ausgehend von der "normalen" Priorität. Normale Benutzer können jedoch nur die Priorität von Prozessen verringern, damit sie das System nicht lahm legen können. 
Die Priorität eines Prozesses kann beim Start des Programmes festgelegt werden, oder auch während der Ausführung noch nachträglich geändert werden


  • nice - Festlegen des Nice-Werts bei Programmstart
    • Nice-Werte verfügbar von -20 bis +19
    • Aufruf von nice ohne Option entspricht einem Nice-Wert von 10
    • negative Werte erhöhen die Priorität
    • Nice-Wert und Prozesspriorität sind nicht das Gleiche. Durch nice wird lediglich Einfluss auf die Prozesspriorität genommen
    • nice hat nur eine Option für den Aufruf, außer --help und -V, nähmlich
      -n   :Übergabe des Nice-Werts (Verwendung der Option jedoch nicht notwendig, da der Nice-Wert auch einfach mit Bindestrich übergeben werden kann
    • :~# nice -15 nano <=> :~# nice -n 15 nano Übergabe des Nice-Werts 15
    • :~# nice --12 pico <=> :~# nice -n -12 pico Übergabe des Nice-Werts -12
  • renice - Ändern des Nice-Werts während der Laufzeit
    • Übergabe des neuen Nice-Werts erfolgt ohne Bindestrich
    • Übergabe des Nice-Werts und der PID ändern den Wert eines Prozesses
      :~# renice -10 1235   Danach werden im Terminal der alte und neue Wert angezeigt
    • -u    :mit dieser Option kann der Nice-Wert alle laufenden Prozesse eines Benutzers auf einmal geändert werden
      :~# renice 5 -u ilonka

top und ps zur Überprüfung von Prioritäten

  • ps -au
    in der achten Spalte kann man anhand eines N erkennen, dass der Prozess nice ist. Läuft der Prozess mit erhöhter Priorität, findet man hier ein <. Die anderen Zeichen in der Spalte haben nichts mit der Priorität zu tun. Das '+' steht für den Prozess, der im Vordergrund läuft, das 'S' für interruptible sleep. Nur wenn das N auftaucht, wurde der Prozess mit nice gestartet.
  • top
    Hier kann man die tatsächliche Priorität und den tatsächlichen Nice-Wert sehen. In der Spalte 3 wird die Priorität dargestellt (Standardwert liegt bei 16). Je größer der Wert, umso geringer ist die Priorität
    In Spalte 4 ist der Nice-Wert des Prozesses zu lesen. Um diesen zu ändern, wird während top aktiv ist die R-Taste gedrückt und entsprechend die PID des zu ändernden Prozesses und sein neuer Nice-Wert eingegeben

103.5 Prozesse erzeugen, überwachen und beenden

Wichtung: 4

Steuerung und Überwachung von Prozessen. Jedes Programm auf einem Computer besteht mindestens aus einem Prozess. Prozesse sind in einer Baumhierachie aufgebaut mit der Wurzel im init (systemd) - Prozess. Dabei hat jeder Prozess eine eindeutige ID, die Prozess-ID (PID). Die PID 0 ist nicht existent!!!


Überwachen von Prozessen und Systemgrößen


  • ps - Anzeige der aktuell laufenden Prozesse als Momentaufnahme
    Dieses Programm zeigt alle aktive Prozesse eines Benutzers oder aller Benutzer an, die in diesem Moment aktiv sind. Kurzlebige Programme werden meist nicht angegeben. Ausführung des Befehls ohne Option zeigt nur die Prozesse an, die mit dem aufrufenden Terminal verbunden sind. Die Optionen können mit einem vorangestellten Strich aufgerufen werden (Unix-Syntax) oder ohne (BSD-Syntax). Die dritte Variante stellt die ausgeschriebenen Optionen dar, was der GNU-Syntax entspricht. Je nach System können die unterschiedlichen Syntaxe zu unterschiedlichen Ergebnissen führen (was ich bisher leider noch nicht nachvollziehen konnte)
    -a    
    :zeigt die Prozesse aller angemeldeten Benutzer des Systems an, die mit einem Terminal verknüpft sind
    -u    
    :Angabe der Startzeit, des Pfads zur ausführbaren Datei und den ausführenden Benutzer
    -x    
    :listet auch Prozesse auf, die nicht mit einem Terminal verbunden sind (z.B. init oder cron)
    -C <prozess>  
    :Ausgabe aller Instanzen eines auf der Kommandozeile angegebenen Prozess
    -U <benutzer>  
    :zeigt die Prozesse eines bestimmten Benutzers an
    -A    
    :zeigt alle Prozesse an, auch die, die nicht mit dem Terminal benutzt werden mit weniger Informationen als die oft verwendete Option -aux

  • pstree - Darstellung aller auf dem Computer laufenden Prozesse als Baumhierachie
    -a    
    :zeigt zusätzliche Optionen und Argumente an, die dem Prozess an der Kommandozeile übergeben wurde
    -G  
    :Ausgabe im VT100-Modus. Optisch andere Ausgabe (Ubuntu und CentOS kein Unterschied zu erkennen)
    -p    
    :zeigt zusätzlich die PIDs an
    -n    
    :Sortierung erfolgt nach PIDs, nicht in alphabetischer Reihenfolge

  • top - Überwachung der auf dem Computer laufenden Prozesse in EchtzeitAusgabe während der Ausführung erfolgt dynamisch. Über der Auflistung der Prozessen wird in der "Headline" verschiedene Informationen des Systems ausgegeben
    • allg. Informationen wie Uhrzeit, Uptime, Anzahl der angemeldeten Benutzer, durchschnittliche Systemauslastung
    • Tasks: Anzahl der Prozesse insgesamt, laufende Prozesse, schlafende Prozesse, gestoppte Prozesse und Zombie-Prozesse
    • CPUs: Benutzung durch Benutzerprozesse, Systemprozesse, den Idle-Prozess (Leerlaufprozess), etc.
    • Mem: Speicher insgesamt, in Verwendung, freier Speicher und für Buffers verwendet
    • Swap: diverse Werte
    Auflistung der laufenden Prozesse in der Reihenfolge der CPU-Verwendung. Inaktive Prozesse werden in der Reihenfolge ihrer PIDs aufgelistet. Während der Laufzeit können top ebenfalls Optionen übergeben werden
    Interaktivoptionen:
    • k (kill) tötet einen Prozess. Angabe der PID und des Signals notwendig
    • n (number of) gibt an, wie viele Zeilen ausgegeben werden sollen
    • r (renice) ändert den Nice-Wert eines Prozesses während der Laufzeit
    • h (help) gibt eine Hilfe aus
    • q (quit)
    • s (seconds) ändert den Aktualisierungsintervall
    Kommandozeilenoptionen
    • -i Anzeige nur der laufenden Prozesse
    • -b (batch) in Kombination mit einem Redirect kann die Ausgabe in eine Textdatei umgeleitet werden
    • -d (delay) Aktualisierungsintervall in Sekunden festlegen. Standartwert liegt bei einer Sekunde
    • -q startet top im Echtzeitmodus (wird nicht von allen Versionen unterstützt)

Signale an Prozesse senden

  • kill -l
    1. SIGHUP            = Hangup Signal (konfigurationsdateien neu einlesen), verlassen der Shell (Verbindungsabbruch, Ausloggen)
    2. SIGINT              = Programmabruch (Strg + C)
    3. SIGQUIT           = Unterbrechen der Terminalverbindung und debuggen
    4. SIGILL               = Ubgültige Anweisung
    5. SIGTRAP          = Unterbrechung (Einzelschrittausführung)
    6. SIGABRT          = Abbruchsignal durch das Programm abort, Abnormale Beendigung
    7. SIGBUS            = Busfehler
    8. SIGFPE            = Fehler bei Gleitkommezahlen-Operationen
    9. SIGKILL            =Kill-Signal, beendet einen Prozess mit Gewalt (ohne Aufräumen)
    10. SIGUSR1          = Frei zur Benutzung, sofern es in den Programmen integriert ist (z.B. dd)
    11. SIGSEGV          = Ungültige Speicher-Referenz
    12. SIGUSR2          = Frei zur Benutzung, sofern es in den Programmen integriert ist
    13. SIGPIPE           = Fehlerhafte pipe: Auf eine pipe schreiben, ohne das ein "Leser" da ist
    14. SIGALRM         = Timer Signal von  dem Programm alarm
    15. SIGTERM         = Beenden eines Prozesses mit Aufräumen
    16. SIGSTKFLT      = ungenutzt (Stack-Fehler im Coprozessor)
    17. SIGCHLD         = Kind-Prozess wurde angehalten, oder gestoppt
    18. SIGCONT         = angehaltenen Prozess fortsetzten
    19. SIGSTOP         = Prozess anhalten
    20. SIGTSTP          = Prozess anhalten, wobei der Prozess speicherresistent bleibt (Strg + Z)
    21. SIGTTIN           = Terminal Eingabe für Hintergrundprozess
    22. SIGTTOU         = Terminal Ausgabe für Hintergrundprozess
    23. SIGURG           = Wichtige Bedingung am Socket
    24. SIGXCPU         = CPU Zeitlimit erreicht 
    25. SIGXFSZ          = Datei-Größen-Limit erreicht
    26. SIGVTALRM     = Virtuelle Alarm Uhr
    27. SIGPROF         = eingestellerter Timer wurde erreicht
    28. SIGWINCH       = Fenster anpassen Signal
    29. SIGIO               = I/O sind jetzt verfügbar
    30. SIGPWR           = Power Fehler 
    31. SIGSYS            = ungültiges Argument zur Ausführung
    32. SIGRTMIN
    33. - 49.SIGRTMIN+1 - SIGRTMIN+15
    1. - 63.SIGRTMAX-14 SIGRTMAX-1
    1. SIGRTMAX

  • kill - Senden eines Signals an einen Prozess
    Als Argument wird die (oder mehrere) PIDs des zu beeinflussenden Prozesses erwartet und natürlich das Signal, welches gesendet werden soll. Wird kein definiertes Signal gesendet verwendet kill SIGTERM, um den angegebenen Prozess zu beenden. Die Signale können dabei als Wort oder ihre entsprechende Nummer übergeben werden. Die Manpage von kill ist sehr übersichtlich. Es gibt 10 verschiedene Möglichkeiten, das Signal an den Prozess zu senden, die jedoch alle den gleichen Effekt haben. Es stehen folgende Optionen zur Verfügung:
    -s  --signal    :spezifiziert das Signal, welches gesendet werden soll
    -l  --list     :gibt die Liste der verfügbaren Signale aus
    -L  --table    :gibt die Liste der verfügbaren Signale als Tabelle aus. Unter Ubuntu muss diese Option mit /bin/kill -L ausgeführt werden. Die Ausgabe enthält die Kurzformen der Signale (z.B. SIGKILL = KILL; SIGTERM = TERM) und die Signale ab SIGRTMIN werden nicht mehr ausgegeben.
    Darstellung der 10 (bzw. 11 bei SIGTERM) Möglichkeiten, wie das Signal gesendet werden kann:

    :~# kill 3167
    :~# kill -s 15 3167
    :~# kill -s SIGTERM 3167
    :~# kill -s TERM 3167
    :~# kill -s sigterm 3167
    :~# kill -s term 3167
    :~# kill -15 3167
    :~# kill -SIGTERM 3167
    :~# kill -TERM 3167
    :~# kill -sigterm 3167
    :~# kill -term 3167
  • killall - Senden eines Signals an einen Prozess mit Prozessnamen
    Bei
    killall wird nicht die PID benötigt, sondern der Prozessname. Damit können dann auch mehrere Prozesse mit gleichen Namen beendet werden. Verwendung ansonsten wie kill
  • pgrep - Ermittlung der PIDs aller laufender Prozesse
    Der vollständige Name muss hierfür nicht bekannt sein. Aufruf ohne Option nicht möglich. Es ist ebenfalls möglich, PIDs von einzelnen Benutzern auszugeben, oder auch wie viele Prozesse ein Benutzer gerade am Laufen hat.
  • pkill - Sendet ein Signal an die gefilterterten Prozesse
    Verwendung wie
    pgrep, nur dass hier ein Signal an den/ die Prozesse übermittelt wird. Z.B können alle Prozesse eines Benutzers beendet werden, was jedoch auch die Login-Shell betrifft, wodurch der Benutzer dann vom System abgemeldet wird.

Jobs im Vorder- und Hintergrund laufen lassen

  • In einer Shell können praktisch beliebig viele Prozesse (Jobs) parallel laufen, aber nur einer im Vordergrund
  • Programme, die im Hintergrund laufen, können den Status running oder stopped haben.
    • running: Läuft im Hintergrund weiter und verrichtet seine Aufgabe
    • stopped: Der Prozess ist angehalten und wartet auf seine Reaktivierung oder Beendigung
  • Strg + z: Programm wird in den Hintergrund transferiert und angehalten (Signal 20 SIGTSTP)
  • Möchte man einen Prozess direkt im Hintergrund starten hängt man beim Aufruf ein & (Et-Zeichen) hinten an. Dabei wird das Programm nur in den Hintergrund transferiert, aber nicht mit dem Signal SIGTSTP gestoppt.
  • jobs     :Anzeige der gerade aktuell laufenden Jobs (Prozesse). Je nach Programm muss man mit dem Aufruf schnell sein, da der Job ansonsten abgeschlossen ist.
    • Nach getaner Arbeit bekommt der Job den Status done. Dieser wird beim Aufruf jobs einmalig angezeigt.
    • Auflistung bei mehreren Prozessen mit Jobnummern in eckigen Klammern
    • Der Job, der mit dem '+' Zeichen versehen ist, wird durch die Programme bg und fg angesprochen, wenn auf der Kommandozeile kein anderes Programm angegeben wird
    • -l    :Die PIDs der Prozesse werden ebenfalls mit ausgegeben
    • -p    :Nur die PIDs werden ausgegeben, sonst keine anderen Informationen (z.B. welches Programm)
  • bg und fg - gestoppte Prozesse erneut starten
    • bg   :gestoppte Prozesse im Hintergrund fortführen. Aufruf mit Hilfe der Jobnummer, die mit Hilfe von jobs ermittelt werden kann
    • fg    :gestoppten Prozess aus dem Hintergrund wieder in den Vordergrund zur Ausführung bringen. Auch hier wird für den Aufruf die Jobnummer verwendet
    • Es wird jeweils das Signal 18 SIGCONT an den Prozess gesendet
    • werden die Programme ohne Angabe der Jobnummer aufgerufen, wird der Prozess mit dem '+' gestartet

Prozesse unabhängig von einem Terminal laufen lassen

  • nohup   :einen Job unabhängig von einer Shell verwenden
    • z.B. sinnvoll, wenn man den Job starten will und dann nach Hause geht (logout)
    • macht den Prozess immun gegen das SIGHUB, SIGINT, SIGQUIT und SIGTERM Signal
    • umleiten der stdout in die Datei nohup.out, welche im Heimatverzeichnis des Benutzers abgelegt wird
  • screen   :Aufrechterhaltung von Sitzungen über Netzwerke, wenn die Verbindung zusammen bricht. Das Programm byobu funktioniert ähnlich, ist aber nicht Prüfungsrelevant
  • uptime   :Ausgabe der aktuellen Zeit, Laufzeit des Systems, Anzahl der Benutzer und die durchschnittliche Anzahl von lauffähigen Jobs in der letzten Minute, den letzten 5 und 15 Minuten aus.
  • w            :Anzeige aller angemeldeten Benutzer am System und welche Prozesse die einzelnen Benutzer gerade in der Verwendung haben. Hier wird ebenfalls die Informationen von uptime ausgegeben
  • free        :Anzeige des Arbeitsspeicher und seiner momentanen Verwendung (Speicherauslastung)
    • -b    :Bytes
    • -k    :KB
    • -m    :MB
    • -g    :GB
    • -l    :Ausgabe aus High- und Low-Memory
    • -o    :altes Format verwenden
    • -t    :Summe für RAM und Swap anzeigen
    • -s    :automatische Aktualisierung in Sekunden (funktioniert unter Ubuntu 16.04 nicht)
    • -c    :Anzahl der automatischen Aktualisierungen definieren, kann in Verbindung mit -s aufgerufen werden, aber nicht unter Ubuntu 16.04
    • -V    :Version

Sonntag, 2. Oktober 2016

103.4 Ströme, Pipes und Umleitungen verwenden

Wichtung 4


  • cmd1 | cmd2    :Die Pipe verbindet 2 Programme. Sie verbindet die Standardausgabe des ersten Programms mit der Standardeingabe des zweiten Programms
  • cmd1 ; cmd2    :cmd2 wird gestartet, wenn cmd1 beendet ist, egal ob mit einer Fehlermeldung, oder ohne. Ausführung nacheinander, ohne Rücksicht auf irgendwelche Bedingungen
  • cmd1 && cmd2   :cmd2 wird nur nur nach erfolgreicher Beendigung von cmd1 gestartet. Dafür wird der Returncode des Betriebssystems verwendet, auch Errorlevel oder Exitlevel genannt. Wird ein Programm erfolgreich beendet, wird der Returncode Null ausgegeben. Alle anderen Werte stehen für eine fehlerhafte Beendigung
  • cmd1 || cmd2   :cmd2 wird nur ausgeführt, wenn cmd1 mit einem Returncode ungleich Null beendet wird (Errorhandling)
  • cmd1 & cmd2    :Das &-Zeichen am Ende eines cmd-Aufrufs sorgt dafür, dass der Befehl im Hintergrund ausgeführt wird und die Befehlseingabe direkt wieder für neue Eingaben zur Verfügung steht. Verbindet man nun zwei Kommandos auf diese Art und Weise, bedeutet es nichts anderes, als dass das erste Kommando im Hintergrund ausgeführt wird und cmd2 im Vordergrund und zwar parallel und unabhängig von irgendwelchen Rückgabewerten
  • cmd > /Verzeichnis/Datei  :stdout wird in eine Datei umgeleitet (keine Ausgabe im Terminal). Entspricht cmd 1> /Verzeichnis/Datei. Die Datei wird dabei wenn sie schon verhanden ist, überschrieben.
  • cmd >> /Verzeichnis/Datei :stdout wird an die (vorhandene) Datei angehängt. Entspricht cmd 1>> /Verzeichnis/Datei
  • cmd 2> /Verzeichnis/Datei :Standard Fehlerausgabe (stderr) wird in die Datei geschrieben. Möchte man die Daten anhängen wird cmd 2>> /Verzeichnis/Datei verwendet.
  • cmd &> /Verzeichnis/Datei :stdout und stderr werden beide in die Datei geschrieben. Auch verwendet: cmd > /Verzeichnis/Datei 2>&1 (dabei besagt das &, dass 1 keine Datei ist)
  • cmd < /Verzeichnis/Datei  :Die Datei wird anstelle der Standard-Eingabe (stdin) verwendet
  • cmd << EOT         :stdin wird nur bis zu einer frei wählbaren Zeichenfolge EOT gelesen und beendet. (HERE Dokument) Hier fehlt mir persönlich noch der Sinn
  • tee <Datei>        :Dieses kleine Programm sorgt dafür, dass die stdout sowohl auf dem Bildschirm ausgegeben wird, als auch in die Datei geschrieben wird.
  • noclobber          :ist diese Shell-Option nicht gesetzt, kann eine existierende Datei durch eine normale Ausgabeumleitung überschrieben werden. Wird die Option aktiviert, ist das Überschreiben nicht mehr möglich, das Anhängen von Daten ist jedoch möglich. Die Option noclobber wird nicht an Subshells vererbt
    set -o noclobber   
    :Überschreiben ist nicht möglich
    set +o noclobber   
    :Überschreiben ist möglich (Standardeinstellung in der Shell) 
  • xargs       :Dieses Tool liest die Standard Eingabe als Liste und führt für jedes Listenelement einen Kommandoaufruf durch. Der Delimiter kann per Option von Zeilenumbruch auf andere Zeichen umgestellt werden.
  • -exec Kommando {}  :Der Parameter exec sorgt dafür, dass für jedes gefundene Argument das angegebene Kommando ausgeführt wird. In Verbindung mit find muss exec mit einem \; abgeschlossen werden. Die geschweiften Klammern hinter dem Kommando stehen für die gefundenen Argumente.