Wie kann man den Ping- und Head-Output von xargs wie erwartet erzeugen?

Wie kann man den Ping- und Head-Output von xargs wie erwartet erzeugen?

Bei einem Array von Domänen möchte ich deren IP-Adressen im folgenden Format erhalten:

98.139.183.24
98.137.236.24

Dieses Skript

#!/bin/bash
domains=(yahoo.com yahoo.ca)
printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1  ping -c 1 -w 3 | grep -E 'PING.*' | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'

gibt die erwartete Ausgabe. Aber zunächst habe ich Folgendes versucht: printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1 ping -c 1 -w 3 | head -n 1 | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'und der Befehl wurde mit einem Signal 13 beendet (was, soweit ich weiß, Rohrbruch bedeutet?!?). Offensichtlich liegt das Problem bei head. Jetzt möchte ich untersuchen, warum es nicht funktioniert und ob und ggf. wie ich dieses lange „Wiener Würstchen“ mit zum Laufen bringen könnte head. Ich habe es noch nicht ausprobiert, bin mir aber ziemlich sicher, dass es mit einer forKonstruktion und Verwendung von headfür jedes funktionieren würde ping. Die Verwendung xargsmit der -POption funktioniert auch nicht. Ich denke, das Hauptproblem wäre, dass die Ausgabe als eine zusammenhängende Datei headausgegeben wird xargs(habe ich es richtig gesagt oder ist es „Eingabe“?).

EDIT1: Mein Ziel war es, die IP-Adressen einer Reihe von Website-Adressen zu erhalten und dann zu prüfen, bei welchen Organisationen diese IPs registriert sind, indem ich whoisdie Ausgabe verwende und weiterleite sedund dann vielleicht eine Gruppierung vornehme, damit ich nur eindeutige Namen habe, keine Wiederholungen. Ich stimme zu, dass digoder hostviel gründlicher sind als , aber ich bin ziemlich sicher, dass die Websites klein genug sind, dass nur eine IP-Adresse für jede Domäne gefunden wird. Trotzdem denke ich, dass ich jetzt ( oder ; ich habe mich noch nicht entschieden) pingverwenden werde, wie andere vorgeschlagen haben.dighost

Um klarzustellen, warum ich daran interessiert bin, es zu verwenden headund nicht, grepwas ich brauche: Ich bin einfach neugierig, wie es gemacht wird (ich bin ziemlich neu bei Bash und Linux im Allgemeinen) und ich hatte das Gefühl, dass es vielleicht aufklären könnte, wie Piping funktioniert. Das ist alles

Antwort1

head -n 1beendet sich, nachdem die erste Zeile gedruckt wurde, und sendet SIGPIPE an den Writer ( xargs), um mitzuteilen, dass kein Prozess mehr vorhanden ist, der das Geschriebene lesen kann. Als Reaktion darauf xargstut es, was die meisten Prozesse tun, und beendet seine Unterprozesse ( ping), gibt eine Warnung aus, sendet wahrscheinlich SIGPIPE an seinen eigenen übergeordneten Prozess und beendet sich dann selbst.

Sie werden jedoch feststellen, dass pipefailder Exit-Code des gesamten Skripts Null ist, da Sie dies in Ihrem Skript nicht festgelegt haben – der Exit-Code des sedBefehls.

Antwort2

echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1

oder mit grep, nur Nicht-Ping-Knoten anzeigen

echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1|grep -b1 100

verwandte Informationen