Moin,

Zitat von
Linus
Achso, dann kann AWK mehr als ich dachte

Sicher kann er das, das ist eigentlich eine komplette Programmiersprache mit Mustererkennung, C-ähnlicher Sprachsyntax und einem erklecklichen Funktionsvorrat.

Zitat von
Linus
Also hier ist die Liste der Ausgaben von dig +short, die ich gesehen habe:
Für die Behandlung in awk würde ich andere dig-Optionen empfehlen, die Dir bessere Kontrolle, z. B. beim Füttern mit mehreren Hostnamen gleichzeitig bringen. Die nachfolgenden Optionen blenden alles aus, was ich nicht sehen will:
Code:
jan@jack:~> dig +nocmd +nocomments +noauthority +noadditional +nostats www.google.de www.g.de www.heise.de
;www.google.de. IN A
www.google.de. 25456 IN CNAME www.google.com.
www.google.com. 27069 IN CNAME www.l.google.com.
www.l.google.com. 270 IN A 209.85.135.103
www.l.google.com. 270 IN A 209.85.135.104
www.l.google.com. 270 IN A 209.85.135.147
www.l.google.com. 270 IN A 209.85.135.99
;www.g.de. IN A
;www.heise.de. IN A
www.heise.de. 72815 IN A 193.99.144.85
Da haben wir gleich mal ein paar der Varianten der möglichen Antworten. Die mit Semikolon beginnenden Zeilen dienen Dir als Marker, dass jetzt ein neuer Host dran ist.
Die "connection timed out"-Meldung dürfte doch eigentlich nur kommen, wenn Du gar keinen DNS-Server im Zugriff hast, oder? Dann sollte mit einer Fehlermeldung abgebrochen werden.
Ich habe mal "quick&dirty" ein Beispiel gebastelt, wie man im awk sowas bearbeiten kann. Da mir noch nicht klar ist, ob Du nun innerhalb der Host-Ausgaben oder insgesamt vergleichen willst und was dabei rauskommen soll, habe ich mal die 1. Variante genommen. Zuerst das awk-Kommandoscript (die Pattern, die dann bestimte Aktionen auslösen, habe ich markiert):
Code:
jan@jack:~/tmp> cat ip.awk
BEGIN { hostname = ""; }
/^;; connection timed out/ { # Fehler: DNS-Server nicht gefunden
print "ERROR: DNS-Server antwortet nicht";
exit;
}
/^;/ { # neuer Host: wenn alter Host != "", dann Auswertungen
if (length(hostname) > 0) {
print "Host: " hostname;
found = 0;
asort(ip_arr);
for (n in ip_arr) {
print "\tIP: " ip_arr[n];
found++;
}
asort(dom_arr);
prev_dom = "";
for (n in dom_arr) {
if (prev_dom != dom_arr[n]) print "\tDomain: " dom_arr[n];
prev_dom = dom_arr[n];
found++;
}
asort(canon_arr);
for (n in canon_arr) {
print "\tCNAME: " canon_arr[n];
found++;
}
if (found == 0) print "\tHost nicht gefunden";
}
# Variablen neu initialisieren
delete ip_arr;
delete dom_arr;
delete canon_arr;
hostname = gensub(/^;(.+)\.$/, "\\1", "g", $1);
}
$4 == "CNAME" { # canonical name; array canon_arr: Key = NR, Wert = CNAME
canon_arr[NR] = $5;
}
$4 == "A" { # ip adresse; array ip_arr: Key = NR, Wert = IP
# domain; array dom_arr: Key = NR, Wert = Domain
dom_arr[NR] = gensub(/\.[0-9]+$/, "", "1", $5);
ip_arr[NR] = $5;
}
END { # vom letzten Host die Daten
print "Host: " hostname;
found = 0;
asort(ip_arr);
for (n in ip_arr) {
print "\tIP: " ip_arr[n];
found++;
}
asort(dom_arr);
prev_dom = "";
for (n in dom_arr) {
if (prev_dom != dom_arr[n]) print "\tDomain: " dom_arr[n];
prev_dom = dom_arr[n];
found++;
}
asort(canon_arr);
for (n in canon_arr) {
print "\tCNAME: " canon_arr[n];
found++;
}
if (found == 0) print "\tHost nicht gefunden";
}
So, und jetzt das Ergebnis:
Code:
jan@jack:~/tmp> dig +nocmd +nocomments +noauthority +noadditional +nostats www.google.de www.g.de www.heise.de | awk -f ip.awk
Host: www.google.de
IP: 209.85.129.104
IP: 209.85.129.147
IP: 209.85.129.99
Domain: 209.85.129
CNAME: www.google.com.
CNAME: www.l.google.com.
Host: www.g.de
Host nicht gefunden
Host: www.heise.de
IP: 193.99.144.85
Domain: 193.99.144
Das ist als Basis zum Weiterprobieren gedacht. Ich habe nur ein paar der Möglichkeiten des awk demonstriert, um ein gründliches Studium der Manual-Page wirst Du nicht herumkommen ;-)
Jan
Lesezeichen