ドメインセットが与えられたら、その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
。今これがうまくいかない理由と最終的にこの長い"ソーセージ"をhead
。for
コンストラクタとhead
すべてping
。xargs
このオプションと組み合わせて使用して-P
も効果はありません。主な問題は、head
出力を単一の連続ファイルとして提供することですxargs
(私は正しいですか、それとも「入力」ですか?)。
編集1:私の目標は、WebサイトのアドレスセットのIPアドレスを取得し、出力を使用してwhois
パイピングして、そのIPがどの組織に登録されているかを確認し、一意の名前だけでsed
重複しないようにグループ化することです。 。私は同意するdig
かhost
それ以上徹底的ping
ですが、これらのサイトはドメインごとに1つのIPアドレスしか見つけることができないほど小さいと確信しています。それでも、今は他の人が提案したdig
(またはhost
まだ決めていない)ことをやろうと思います。
head
私が必要なものの代わりに使用することに興味がある理由を見つけるためにgrep
:私はそれがどのように行われるのか疑問に思いました(私は一般的にbashとLinuxに触れます)、パイプがどのように機能するかを明確にすることができると思いました。それだけです。
答え1
head -n 1
最初の行を印刷してから終了し、xargs
SIGPIPEをライター()に送信して、自分が書いた内容を読み取ることができるプロセスがないことを示します。これに応答して、xargs
ほとんどのプロセスが実行するアクションを実行し、子プロセス(ping
)を終了し、警告を印刷し、SIGPIPEを独自の親プロセスに送信して、自分で終了します。
pipefail
ただし、スクリプトでこれを設定していないため、スクリプト全体の終了コードは0(sed
コマンドの終了コード)であることがわかります。
答え2
echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1
または、grepを使用してping以外のノードのみを確認してください。
echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1|grep -b1 100