Der sedBefehl, der awkBefehl 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 awkBefehl der Anweisung folgt done, wird nur ein awkProzess 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, fdie 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 fsie 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 fauf Null zurückgesetzt (falsch).
Mit anderen Worten fungiert fhier als logische Bedingung. Die Befehle in geschweiften Klammern werden ausgeführt, wenn sie fungleich Null sind (was in awk 'wahr' bedeutet).
/ANSWER SECTION/{f=1}
Wenn die aktuelle Zeile den String enthält ANSWER SECTION, wird die Variable fauf 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 +shortes bei Ihnen nicht funktioniert?