Textdateien in Massen auslesen

Post Reply
Message
Author
micbur
Posts: 86
Joined: 05. Jun 2004 15:55

Textdateien in Massen auslesen

#1 Post by micbur »

Hallo,

also nach meinen Begriffen habe ich alles Mögliche getan. Ich bekomme aber keinen schnellen Weg hin.

Wir wollen eine Lsite aller Domains haben, die bei uns laufen, die uns gehören und auch in Benutzung sind. Es gibt darüber bisher keine Übersicht. Nun habe ich hier über 250 Dateien von unserem DNS-Server. Darin enthalten sind alle Domains und Subdomains. Die Struktur der Dateien ist recht unterschiedlich.

Glücklicherweise fangen alle gültigen Einträge am Zeilenanfang an.
Kommentarzeilen beginnen mit einem ';'.

Ich versuche nun verzweifelt herauszubekommen, zu welcher Domaine welche Subdomaine aktiv ist. Die Dateinamen bilden dabei den Domainnamen.

Ich habe nun viele Versuche gestartet, aber ich komme einfach bisher nicht drumrum > 200 Dateien anzuschauen. Mit grep komme ich einfach nicht weiter.

Bitte bitte bitte, hat nicht jemand eine Idee?

Ciao, micbur

Alex.MH

#2 Post by Alex.MH »

Poste doch mal ein Beispielfile. Wie soll dir jemand helfen, ohne den Aufbau des Dateinamens und den Inhalt zu kennen.

Gruss,
Alex

petameta
prolinux-forum-admin
Posts: 1294
Joined: 14. Feb 2003 13:19

#3 Post by petameta »

Für solche Aufgaben ist awk wie geschaffen. Eine Beispieldatei würde in der Tat helfen. Auch kann ich Dir dazu das Buch "The AWK Programming Language" von Aho, Kernighan und Weinberger empfehlen, das ist ne echt gute Einführung.

micbur
Posts: 86
Joined: 05. Jun 2004 15:55

#4 Post by micbur »

Hallo,

nach so langer Funkstille, also einem Tag, muss ich mich melden. Hatte ne Menge jetzt um die Ohren.

Also so ein DNS-Eintrag bei uns sieht so aus, dass es eine Datei mit dem Domainnamen gibt. In dieser Datei sind die Aliase (oder Subdomains) enthalten. Das sieht zum Beispiel so aus:

Code: Select all

www IN CNAME srv001
heißt, die Subdomaine 'www' wird auf den Server, den wir als 'src001' kennen umgeleitet. Was dann wieder srv001 in eine IP umwandelt, steht in einer anderen Zeile. Da wir aber nur zwei Dutzend Server haben und die Bezeichnung in den Dateien für identische Server immer dieselbe ist, macht mir das weniger Probleme.

Allerdings stehen in einer DNS-Datei mehrere Aliase (Subdomains), die dann auf verschiedene Server umgeleitet werden. Es kann also auch sein, das wir sowas haben wie:

Code: Select all

www IN CNAME srv001
www2 IN CNAME srv100
www42 IN CNAME srv042
Mit meinen entwickelten RegExps komme ich nicht weiter. Ich habe auch schon einige versuche mit print hinter mir. Nutzt alles nix. Mein Wissen reicht nicht aus. Recherche brachte mich bisher auch nicht auf einen grünen Zweig und mit awk habe ich auch noch nie gearbeitet, sodass ich gerne eine zweite Meinung hören würde. Manchmal ist man ja so eingefahren in seinen Gedankengängen. Vielleicht hat ja jemand eine tolle Idee.

Ciao, micbur

petameta
prolinux-forum-admin
Posts: 1294
Joined: 14. Feb 2003 13:19

#5 Post by petameta »

Ich bin mir immer noch nicht 100%ig sicher, was Du machen möchtest. Wie schon gesagt eignet sich awk sehr gut für sowas, da es für die Verarbeitung von Textdateien erstellt wurde. Hier mal so eine kleine Einführung, damit Du eine Idee hast, wie's funktioniert und wo die Vorteile liegen:

awk zerlegt Zeilen einer Textdatei automatisch in Felder. Nehmen wir mal Dein Beispiel mit den 3 Zeilen mit www, www2 und www42, folgendes awk-Skript:

Code: Select all

{ print $1 } 
Gibt Dir folgendes aus:

Code: Select all

www
www2
www42
Also immer das erste Feld. Entsprechend gibt Dir

Code: Select all

{ print $4 } 
das hier aus:

Code: Select all

srv001
srv100
srv042
$0 würde Dir immer die gesammte Zeile liefern.

Das ließe sich sicherlich auch mit anderen Programmiersprachen machen, ist aber mit awk sehr schnell und einfach programmiert.

Du hast die Kommentarzeilen erwähnt. Ich setze mal voraus, daß das ; immer am Anfang der Zeile steht und zudem immer mindestens ein Leerzeichen nach dem ; folgt. Dann könnte man alle Kommentarzeilen wir folgt aussortieren:

Code: Select all

{
  if ( $1 != ";") { Mache was sinnvolles }
}
Wenn diese Voraussetzungen nicht gegeben sind wird's komplizierter, awk bietet dafür aber in vollem Umfang Möglichkeiten wie if-Abfragen, sämtliche Schleifen-Varianten, Variablen, String-Funktionen usw. Das ist denke ich der Vorteil gegenüber RegExps, awk ist flexibler. Mit RegExps muß man sich irgendwann ganz schön verrenken wenn's kompliziert wird. Nebenbei: Wenn man's trotzdem braucht versteht awk auch RegExps.

Den Namen der Datei, die ja der Domain entspricht, bekommst als Kommandozeilenparameter übergeben. Dies funktioniert wie in C mit ARGC und ARGV, ARGV[1] ist also der Name der Datei.

Der Nachteil ist, daß es keine wirklich guten Tutorials im Netz gibt, deswegen habe ich Dir das Buch empfohlen. Leider ist es nicht ganz billig, gibt aber in zwei kurzen Kapiteln eine gute, leicht verständliche und schnelle Einführung.

Post Reply