Der sed
Befehl, der awk
Befehl und das Entfernen der Nachlaufzeit können zu einem einzigen awk-Befehl zusammengefasst werden:
while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
Oder über mehrere Zeilen verteilt:
while read -r host
do
dig +search "$host" ALL
done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
Da der awk
Befehl der Anweisung folgt done
, wird nur ein awk
Prozess aufgerufen. Obwohl Effizienz hier keine Rolle spielt, ist dies effizienter, als mit jeder Schleife einen neuen Sed- oder Awk-Prozess zu erstellen.
Beispiel
Mit dieser Testdatei:
$ cat hostlist.txt
www.google.com
fd-fp3.wg1.b.yahoo.com
Der Befehl erzeugt:
$ while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
www.google.com, 216.58.193.196
fd-fp3.wg1.b.yahoo.com, 206.190.36.45
Wie es funktioniert
awk liest implizit seine Eingabe einen Datensatz (Zeile) nach dem anderen. Dieses awk-Skript verwendet eine einzelne Variable, f
die angibt, ob die vorherige Zeile ein Antwortabschnitt-Header war oder nicht.
f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Wenn die vorherige Zeile eine Kopfzeile des Antwortabschnitts war, ist f
sie true und die Befehle in geschweiften Klammern werden ausgeführt. Die erste entfernt die abschließende Periode aus dem ersten Feld. Der zweite druckt das erste Feld ,
, gefolgt von dem letzten Feld. Die dritte Anweisung wird f
auf Null zurückgesetzt (falsch).
Mit anderen Worten fungiert f
hier als logische Bedingung. Die Befehle in geschweiften Klammern werden ausgeführt, wenn sie f
ungleich Null sind (was in awk 'wahr' bedeutet).
/ANSWER SECTION/{f=1}
Wenn die aktuelle Zeile den String enthält ANSWER SECTION
, wird die Variable f
auf 1
(true) gesetzt.
Hier /ANSWER SECTION/
dient als logische Bedingung. Es wird als wahr ausgewertet, wenn der Strom mit dem regulären Ausdruck übereinstimmt ANSWER SECTION
. Wenn dies der Fall ist, wird der Befehl in geschweiften Klammern ausgeführt.
dig +short
es bei Ihnen nicht funktioniert?