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.

Montag, 26. September 2016

103.3. Grundlegende Dateiverwaltung

Wichtung :4

Verwaltung von Dateien und Verzeichnissen


  • cp
    kopieren von Dateien und Verzeichnissen. Angabe von Quelle und Ziel immer notwendig. Letztes Argument ist immer das Zielverzeichnis
    • Quelle wie auch das Ziel können wahlweise relativ oder absolut angegeben werden. 
    • Ziel kann Datei oder Verzeichnis sein. 
    • Sollen mehrere Quelldateien kopiert werden, geht die Shell davon aus, dass es sich bei dem Ziel um ein Verzeichnis handelt.
    • -i    --interactive   :Per Voreinstellung wird die Zieldatei überschrieben, sofern sie schon vorhanden ist. Um dies zu verhindern kann die Option -i verwendet werden
    • -d    --no-dereference:kopiert Symlinks als Symlinks und nicht deren Inhalt. Soll ein Backup gemacht werden, muss jedoch das Zielverzeichnis unbedingt mit kopiert werden
    • -a    --archive       :diese Option macht das Gleiche wie -Rpd
    • -f    --force         :erzwingt den Schreibvorgang im Zielverzeichnis. 
    • -l    --link          :kopiert Dateien nicht physisch, sondern legt Hardlinks an (-s legt Symlinks an). Geht nur auf der selben Partition
    • -s    --symbolic-link :legt im Zielordner nur Symlinks an, kopiert die Dateien nicht physisch
    • -p   --preserver      :kopiert Dateien bzw. Verzeichnisse unter Beibehaltung des Eigentümers, der Eigentümergruppe, der Berechtigungen und der Timestamps. Wichtig für Backups!!!
    • -R -r  --recursive    :kopiert ein Verzeichnis inklusive aller Unterverzeichnisse und Dateien 
  • cd
    • cd ../..       :wechselt zwei Verzeichnisebenen höher
    • cd ../dateien  :wechselt zuerst eine Verzeichnisebene höher und dann dazu relativ ins Verzeichnis "dateien"
  • find -> siehe späteren Post zum Auffinden von Dateien
  • file
    Aufruf von file <Datei> gibt den Dateityp der Datei aus
  • mkdir
    • -p    --parents: erstellt noch nicht existierende übergeordnete Verzeichnisse. Damit können komplexe Verzeichnisstrukturen mit einem Befehl angelegt werden
    • -m    --mode   : stellt die Berechtigung für das neue Verzeichnis während der Erstellung ein.
      Z.B.
      ilonka@superhero:~$ mkdir -m 700 Test erzeugt einen Ordner Test für den aktuell angemeldeten Benutzer, dass nur dieser exklusiv verwenden kann, und auf das er Schreibrechte hat
  • mv
    Verschieben von Dateien und Verzeichnissen
    • Befinden sich Quelle und Ziel auf der gleichen Partition, werden lediglich die Einträge in den jeweiligen Verzeichnissen geändert. Nur Partitionsübergreifend werden die Dateien und Verzeichnisse tatsächlich verschoben, weshalb der Vorgang mehr Zeit in Anspruch nimmt
    • -u     --update      :Erstellt die Datei im Zielverzeichnis nur, wenn die eventuell vorhandene Datei älter als die Quelldatei ist oder die Datei noch nicht existiert
    • -i    --interactive  :Fragt nach, ob existierende Dateien tatsächlich überschrieben werden sollen
    • -f    --force        : erzwingt den Schreibvorgang im Zielverzeichnis
  • ls
    Auflistung des Inhalts eines Verzeichnisses
    • -l    :Listingformat -> Angabe der Zugriffsberechtigungen, Timestamps, Dateigröße und Owner
    • -i    :zeigt die verwendete Inodes der Dateien und Verzeichnisse an
    • -a    :Auflistung aller Dateien, auch der versteckten (mit einem Punkt versehenen). Verwendet man -A so werden die Punktoperatoren nicht mit ausgegeben
    • -s    :in Kombination mit -l Angabe der Dateigröße in Blöcken
    • -h    :Dateigröße in menschenleslichem Format ausgeben, in Kombination mit -l
  • rm
    • Löschen von Dateien und Verzeichnisse (mit der entsprechenden Option)
    • Es sind die Schreibrechte in dem Verzeichnis notwendig, nicht jedoch auf die Datei selbst
    • -R -r  --recursive  :löscht, auf ein Verzeichnis angewendet, auch alle Unterverzeichnisse und alle Dateien
    • -i    --interactive :fragt vor dem Löschen jeder Datei (und Verzeichnisse) nach, ob sie wirklich gelöscht werden soll
    • -f    --force           :erzwingt das Löschen. Fehlermeldungen, die durch nicht vorhandene Dateien entstehen, werden unterdrückt
  • rmdir
    • löschen leerer Verzeichnisse
    • Verzeichnisse mit Dateien können nicht gelöscht werden
    • -p    :Übergeordente Verzeichnisse werden automatisch mit gelöscht, wenn diese durch die Löschung des eigentlichen Verzeichnisses leer werden
  • touch
    • Timestamps einer Datei ändern
    • kann ebenfalls dazu verwendet werden, um neue Dateien mit der Größe 0Bytes anzulegen
    • Aufruf ohne Option gibt der Datei das aktuelle Datum
    • -t    :Timestamp auf den Wert [[CC]YY]MMDDhhmm[.ss]
    • -a    :ändert nur die letzte Zugriffszeit
    • -m    :ändert nur die letzte Änderungszeit
  • tar
    • Archivierungsprogramm
    • Aufruf der Optionen mit Bindestrich und ohne möglich
    • -x    :(extract) extrahiert ein Archiv
    • -z    :(gzip/gunzip) Komprimierung mittels gzip, bzw. Entkomprimierung mittels gunzip
    • -v    :Verbose Mode
    • -c    :(create) erstellt ein neues Archiv
    • -t    :(table) listet den Inhalt eines Archivs auf
    • -j    :Komprimierung mittels bzip2 bzw. Entkomprimierung mittels bunzip2
    • -f    :(file) Es wird zur Eingabe- bzw. Ausgabe eine Datei verwendet
    • Anordnung der Optionen beliebig, außer -f, welches immer als letzte Option genannt werden muss
  • cpio
    • Dateien aus einem Archiv heraus oder rein kopieren
    • wird heutzutage kaum noch verwendet (siehe tar)
    • verschiedene Modi aus Sicht des Dateisystems und nicht aus Sicht von cpio
    • -i  --extract     :Copy-in-Modus; Dateien werden aus dem Archiv in das Dateisystem kopiert
    • -o  --create      :Copy-out-Modus; Dateien werden aus dem Dateisystem in ein Archiv kopiert, welches im ersten Schritt erzeugt wird 
    • -p  --pass-through:In diesem Modus werden Dateien kopiert und in das angegebene Verzeichnis abgelegt 
  • dd
    • kopieren oder konvertieren von Dateien. Dabei werden diese Bitgenau kopiert
    • Möglichkeit Betriebssysteme von einer Platte auf eine andere zu klonen (Plattengröße beachten, da der MBR ebenfalls mitkopiert wird)
    • Aufruf ohne Option erzeugt nur die Ausgabe des eingegebenen Text in der stdout (abschicken mit Strg + d)
    • Duplizieren von Festplatten: achangel:/ #dd if=/dev/sda of=/dev/sdb
    • dd benötigt erhebliche Zeit
  • gzip
    • Komprimierung von Dateien
    • sollen mehrere Dateien zusammengefasst werden, macht der Aufruf per tar mit den entsprechenden Optionen mehr Sinn
    • Wird gzip ohne Optionen aufgerufen, wird die Datei komprimiert abgelegt und mit der Endung .gz versehen. Die Originaldatei wird dabei gelöscht
    • -k    :Die Originaldatei bleibt nach der Komprimierung erhalten
    • mehrere Dateien können auf einmal komprimiert werden, indem man sie mit Leerzeichen getrennt aufruft. Es wird jedoch kein Archiv gebildet. Verwendung von Wildcards ebenfalls möglich
  • gunzip
    • Entkomprimiert Dateien, die mit gzip komprimiert wurden
    • löscht die komprimierte Datei nach der Dekomprimierung, außer bei Verwendung der Option -k
    • Alternativ kann auch gzip -d (decompress) aufgerufen werden
    • zcat verhält sich ohne Option wie gunzip -c
  • bzip
    Alternative zu gzip mit meist einer höheren Kompressionsrate. Dekomprimierung erfolgt über bunzip2,
    bzip2 -d oder bzcat (alle drei Varianten verwenden das gleiche Programm per Symlink)
  • xz
    • Erzeugung komprimierter Archive mit der Dateierweiterung .xz
    • Verwendung wie unter gzip und bzip2
    • Dekompression: unzx und xzcat
    • -z  --compress
    • -d  --decompress  --uncompress
    • -t  --test
    • -l  --list
  • Wildcards
    • Wildcards werden verwendet, um Operationen auf mehrere Dateien gleichzeitig ausführen zu können
    • Bei der Suche von Dateien ist es so ebenfalls möglich, nach Dateien zu suchen, dessen genauen Namen nicht bekannt sind
    • Wildcards werden durch die Shell interpretiert und können daher von jedem Programm verwendet werden
    • Beispiele siehe unten
    • * ersetzt null oder mehr Zeichen. Das heißt, dass auch die Datei mit dem gesuchten Begriff ohne anhängenden Zeichen angezeigt werden.
    • ? ersetzt genau ein Zeichen hinter dem Suchbegriff. Dabei wird die Datei mit dem Suchbegriff selbst nicht angezeigt
    • [a-z] ersetzt ein einzelnes Zeichen aus dem angegebenen Bereich, gibt aber wieder nicht die Datei aus, die nur den Suchbegriff enthält
    • [abcde] ersetzt ein einzelnes der angegebene Zeichen
    • [!a-z] ersetzt ein einzelnes Zeichen, welches nicht angegeben ist 
  • absolute Pfadangabe: beginnt immer mit einem Slash. Es wird immer der gesamte Pfad angegeben. Z.B. /var/log
  • relative Pfadangabe: Bewegung im aktuellen Verzeichnis. Aufruf erfolgt hier ohne Slash. z.B. cd log innerhalb des Verzeichnis /var