xargs pingとヘッド出力を期待どおりにするには?

xargs pingとヘッド出力を期待どおりにするには?

ドメインセットが与えられたら、そのIPアドレスを次の形式で取得したいと思います。

98.139.183.24
98.137.236.24

このスクリプト

#!/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:'

期待される出力を提供します。しかし、最初は試しましたが、 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:'コマンドはシグナル13で終了しました(私が理解したところ、これはパイプが破損していることを意味しますか?!?)。明らかに問題はですhead。今これがうまくいかない理由と最終的にこの長い"ソーセージ"をheadforコンストラクタとheadすべてpingxargsこのオプションと組み合わせて使用​​して-Pも効果はありません。主な問題は、head出力を単一の連続ファイルとして提供することですxargs(私は正しいですか、それとも「入力」ですか?)。

編集1:私の目標は、WebサイトのアドレスセットのIPアドレスを取得し、出力を使用してwhoisパイピングして、そのIPがどの組織に登録されているかを確認し、一意の名前だけでsed重複しないようにグループ化することです。 。私は同意するdighostそれ以上徹底的pingですが、これらのサイトはドメインごとに1つのIPアドレスしか見つけることができないほど小さいと確信しています。それでも、今は他の人が提案したdig(またはhostまだ決めていない)ことをやろうと思います。

head私が必要なものの代わりに使用することに興味がある理由を見つけるためにgrep:私はそれがどのように行われるのか疑問に思いました(私は一般的にbashとLinuxに触れます)、パイプがどのように機能するかを明確にすることができると思いました。それだけです。

ベストアンサー1

head -n 1最初の行を印刷してから終了し、xargsSIGPIPEをライター()に送信して、自分が書いた内容を読み取ることができるプロセスがないことを示します。これに応答して、xargsほとんどのプロセスが実行するアクションを実行し、子プロセス(ping)を終了し、警告を印刷し、SIGPIPEを独自の親プロセスに送信して、自分で終了します。

pipefailただし、スクリプトでこれを設定していないため、スクリプト全体の終了コードは0(sedコマンドの終了コード)であることがわかります。

おすすめ記事