linux:textdateibehandlung

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:

  • cat Datei(en): liest die Datei(en) aus und zeigt sie nacheinander an.
  • uniq: meldet oder löscht doppelte Zeilen
  • wc: zählt die Wörter, mit „-l“ die Zeilen
more Datei
less Datei (man kann zurückscrollen)
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.

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"
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

  • awk: Ähnlich zu sed. Es liest Dateien (oder von der Standardausgabe anderer Programme) zeilenweise, wendet Anweisungen auf jede Zeile an und schreibt das Ergebnis auf den Bildschirm. Das besondere an awk: es kennt “Spalten” (die in Datei z.b. durch Leerzeichen oder Tabulatoren kenntlich gemacht wurden). Mit awk kann man z.b. Einzelne Spalten anzeigen, Rechenoperationen anwenden und Spalten wieder ausgeben.
  • cut: extrahiert Textspalten aus einer Datei (oder von der Standardausgabe anderer Programme). Beispiel: cut liest einzelne Spalten (hier die erste) aus einer Kommaseparierten Liste.
    cut -d','\ -f1
  • sed: liest Dateien (oder von der Standardausgabe anderer Programme), ändert den Inhalt entsprechend dem Kommando und schreibt das Ergebnis auf den Bildschirm. Die Datei bleibt unverändert. Beispiel:
    sed s/baum/busch/ gehoelze

    ersetzt alle Vorkommen von Baum durch Busch der Datei „gehoelze“.

  • tr: Zeichen aus einem (Text-)Datenstrom konvertieren oder löschen
  • Unterschiede anzeigen:
    • diff: zeigt Unterschiede zweier Textdateien an
    • sdiff: zeigt Unterschiede zweier Textdateien benutzerfreundlich nebeneinander an.
  • einen Patch anwenden: Wenn man mit diff den Unterschied zwischen zwei (Text)Dateien herausgefunden hat, kann man diese Differenz auf das Original anwenden ohne die geänderte Datei komplett zu übertragen.

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.

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.