nslookup awk zu einer Datei, die „Antwort“ anzeigt

nslookup awk zu einer Datei, die „Antwort“ anzeigt

Ich führe derzeit ein Skript aus, das nslookup auf einer Reihe von Hosts verwendet und dann awk verwendet, um die gewünschten Zeilen in eine Tabelle zu drucken. Ich drucke eine Zeile in Datei1 und eine andere in Datei2 und verwende dann, paste file1 file2 >> file3um diese Tabelle zu erstellen.

Die Tabelle sieht so aus

Host   IP
name  10.10.10.10
name  10.10.10.10
name 10.10.10.10

Das funktioniert größtenteils. Aber aus irgendeinem Grund erhalten etwa 20 meiner 160 Ergebnisse in der linken Spalte „Answer:“ und in der rechten Spalte erscheint der Hostname. So:

Host IP
answer:  hostname

Dies wird in den Ergebnissen zufällig angezeigt und ich kann es nicht herausfinden, da das Wort „Answer:“ im nslookup nirgends vorkommt, sodass das Skript nicht versehentlich einen Fehler auslösen könnte.

Hier ist mein Skript als Referenz:

hosts='hosts.list'
filelines=`cat $hosts`

Empty_Containers(){
        truncate -s 0 tmp.txt
        truncate -s 0 file1
        truncate -s 0 file2
}

for h in $filelines ;
do
        Empty_Containers
        nslookup $h > tmp.txt
        if grep -q "NXDOMAIN" tmp.txt
        then
                cat tmp.txt | awk 'FNR ==4 {print$5}' > file1
                echo "Did_Not_Resolve" > file2
                paste file1 file2 >> i.txt
        else
                cat tmp.txt | awk 'FNR ==4 {print$2}' > file1
                cat tmp.txt |awk 'FNR ==5 {print$2}' > file2
                paste file1 file2 >> i.txt
        fi
        cat i.txt | column -t 2 i.txt
done

Antwort1

Wenn Ihr gewünschtes Ziel lediglich die Erstellung einer Tabelle mit Hostnamen und IP-Adressen ist und Sie nicht besonders auf die Verwendung achten nslookup, konnte ich die gewünschte Ausgabe scheinbar mit einer schnellen for .. echoSchleife erstellen:

for h in $( cat hosts.list ); do
    a=$(dig +short $h | head -n1)
    echo -e "$h\t${a:-Did_Not_Resolve}"
done

digist ein etwas benutzerfreundlicheres DNS-Tool als . nslookupDie Verwendung der +shortOption macht die Ausgabe noch übersichtlicher. Die Ausgabe einer Anfrage, für die kein Datensatz vorhanden ist, ist eine leere Zeichenfolge. Daher verwende ich die integrierte bashStandardparametererweiterung ( ${var:-default}), um den Fall zu behandeln, dass kein Datensatz vorhanden ist, was eine „Standard“-Antwort von ergibt Did_Not_Resolve.

$ dig www.example.com

; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com.       IN  A

;; ANSWER SECTION:
www.example.com.    20308   IN  A   93.184.216.34

;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE  rcvd: 60

$ dig +short www.example.com
93.184.216.34

Der endgültige Ertrag ist dieser Output:

www.example.com 93.184.216.34
www.google.com  172.217.14.68
host.doesnotexist.tld   Did_Not_Resolve
unix.stackexchange.com  151.101.129.69

Eine Alternative zu digist auch host:

$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69

Als Antwort auf die Fragen im folgenden Kommentar:

Die einzige Option, die ich für verwende, digist +short, wodurch die Ausgabe entweder auf die IP-Adresse des angegebenen Hosts oder andernfalls auf eine leere Zeichenfolge reduziert wird. Ich führe es digin einer Subshell ( $( dig [...] )) aus, da ich deren Ausgabe erfasse und sie der Variablen a(für „Adresse“) zuweise. Ich leite die Ausgabe von digweiter head -n1, da einige Hosts (wie der Host) unix.stackexchange.commehrere IP-Adressen zurückgeben; der Einfachheit halber nehme ich einfach die erste.

Der Grund dafür, dass dies in eine Variable extrahiert wird, besteht darin, dass wir einen einfachen Parametererweiterungstrick verwenden können, um den Text „Nicht aufgelöst“ anstelle einer leeren Zeichenfolge bereitzustellen, wie hier zuvor beschrieben.

Genauere Erläuterung der echoAussage wie gewünscht:

echo -e "$h\t${a:-Did_Not_Resolve}"
  • Der -eSchalter zeigt an echo, dass ichtScape-Sequenzen. In diesem Fall verwende ich \t, was in Kombination mit -ezu einem wird Tabund nicht zu einem wörtlichen Escape-Zeichen t.
  • $hwird, wie zu erwarten, einfach durch den Inhalt der Variablen ersetzt h.
  • \twird, wie bereits erläutert, zu einem Tab.
  • ${a:-Did_Not_Resolve}. Ah, hier liegt die Magie. bashhat die Fähigkeit, bei der Parametererweiterung ein wenig Introspektion als Teil des Prozesses durchzuführen. Die Syntax ${var:-default}wird auf den Inhalt der Variablen erweitertvar oder, wenn dieser Wert nicht gesetzt oder null ist, der angegebene Ersatz (in diesem Beispielfall default; oder im tatsächlichen Anwendungsfall hier Did_Not_Resolve). Weitere Einzelheiten hierzu finden Sie auf der bashManualpage im Abschnitt „Parametererweiterung“.

Als Endergebnis wird in jeder Zeile in der folgenden Reihenfolge der Hostname, ein Tab, und entweder die Adresse (falls vorhanden) oder der Text Did_Not_Resolve(falls nicht vorhanden) ausgegeben.

verwandte Informationen