Inhaltsverzeichnis

Textdateien behandeln

Oft werden wir es mit Textdateien zu tun haben, dabei intessiert uns nur ein bestimmter Inhalt. Das können z.b. Log-Dateien sein oder Konfigurationsdateien. Hier erst einmal eine Übersicht:

Seitenweise anzeigen

more Datei
less Datei (man kann zurückscrollen)

Anfang / Ende anzeigen

head -n Anzahl Datei

Zeigt die ersten Anzahl Zeilen einer Datei an

tail [- n Anzahl] [-f] Datei

Zeigt die letzten Anzahl Zeilen einer Datei an. Die Option -f bewirkt, dass sich tail danach nicht beendet, sondern wartet ob neue Zeilen in die Datei geschrieben werden (z.b. von anderen Programmen). Diese Änderungen werden dann auch angezeigt. Abbruch mit CTRL-c. Nützlich um z. B. Apache- oder Syslog -files „live“ zu beobachten.

Durchsuchen

grep Suchmuster Datei [Dateien]

Grep durchsucht Datei[en] nach Suchmustern und gibt die Zeilen der Datei[en] aus, wo das Suchmuster zutrifft. Viele Funktionsschalter (z.B. -i für das Ignorieren der Großschreibung) machen das Program sehr nützlich.

:!: grep -c zählt auch die Anzahl der Treffer

siehe auch Suchen in und nach Dateien und Wie finde ich Dateien? Beispielweise sehr nützliche für mich ist der folgende Befehl zum durchsuchen von Dateien des aktuellen Verzeichnisses (und darunter) nach der bestimmten Zeichenkette „SUCHTEXT“

find . -type f -exec egrep -i "SUCHTEXT" /dev/null {} \;

Schneller ist die Verwendung von xargs. Anstatt bei jedem Treffer das entsprechenden Kommando (bei exec) aufzurufen, wird xargs einfach die Liste der Dateien übergeben und xargs ruft dann den angegebenen Befehl (egrep -i „SUCHTEXT“) mit der Dateiliste auf. Anstatt -exec anzugeben wird also einfach xargs aufgerufen:

find . -type f | xargs egrep -i "SUCHTEXT"

Sortieren

sort Kriterien Datei

Sortiert Datei nach Kriterien. Bsp: sort -t : -k 3 /etc/passwd sortiert die Datei /etc/passwd nach der dritten Spalte und verwendet den Doppelpunkt als Spaltentrenner

Text(-datenströme) bearbeiten

Unterschiede anzeigen / einen Patch anwenden

diff kann mehrere Formate erzeugen, im einfachsten Fall (ohne weitere Parameter) wird nur die geänderte Zeile und die Position angezeigt:

77c77
<       start-stop-daemon --stop --signal 1 --quiet --exec "$SYSLOGNG" --pidfile "$PIDFILE" || { echo " not running."; return 1; }
---
>       start-stop-daemon --stop --signal 1 --quiet --exec "$SYSLOGNG" --pidfile "$PIDFILE" || return 1

Das ist nun nicht sehr menschenlesbar und man erkennt auch nicht den Kontext den geänderten Zeile. Daher eignet sich das unified-Format (Option -u) besser.

Anwendungsbeispiel

ein
diff -u syslog-ng syslog-ng.new

ergibt die folgende Ausgabe

--- syslog-ng       2008-02-24 18:18:05.000000000 +0100
+++ syslog-ng.new   2008-02-24 18:20:45.000000000 +0100
@@ -74,7 +74,7 @@
     echo -n "Reload system logging: $NAME"
     if /sbin/syslog-ng -s
     then
-      start-stop-daemon --stop --signal 1 --quiet --exec "$SYSLOGNG" --pidfile "$PIDFILE" || return 1
+      start-stop-daemon --stop --signal 1 --quiet --exec "$SYSLOGNG" --pidfile "$PIDFILE" || { echo " not running."; return 1; }
       echo "."
       return 0
     else

hinten wurde also die Meldung „not running“ eingefügt, falls syslog-ng nicht läuft. Die Zeile mit dem Minus als erstes Zeichen ist die alte Zeile und die mit dem Pluszeichen die Änderung. Diese Änderung kann man auch in eine Datei speichern:

diff -u syslog-ng syslog-ng.new > syslog-ng.patch

und auf allen passenden Systemen mit dem Befehl patch anwenden:

patch /etc/init.d/syslog-ng syslog-ng.patch

Der (erfolgreich) angewendete Patch wird nun nicht mehr benötigt.

regular expressions (RegEx, reguläre Ausdrücke)

Ein Regulärer Ausdruck (engl. Regular expression) ist in der Informatik lt. Wikipedia eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Sie werden als Filter oder Schablone in fast allen Programmiersprachen verwendet.

Syntax

RegExps: Zeichenketten können durch Kombinationen von Regulären Ausdrücken flexibel beschrieben werden:

Kriterium Regulärer Ausdruck
wirkt auf Ausdrücke am Zeilenanfang ^
wirkt auf Ausdrücke am Zeilenende $
Null oder mehrere beliebige Zeichen *
Null oder mehrere Zeichen („x“) [x]*
Ein Zeichen ?
wirkt auf a oder b a|b
Ein oder kein Zeichen „x“ [x]?
Ein oder mehrere Zeichen („x“) [x]+
Genau 5 „x“ [x]{5}
Zwischen 6 und 12 „x“ [x]{6,12}
Genau ein beliebiges Zeichen .
Ein Zeichen aus dieser Menge A-Z a-z 0-9 [aeiou] usw….

Die regulären Ausdrücke können mit (runden) Klammern gruppiert werden.

:!: spezielle Zeichen (wie $ oder \ selber) müssen mit \ „escaped“ werden, damit sie nicht von der Shell interpretiert werden.