
ドメインの配列が与えられたら、次の形式で 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
。今度は、なぜ動作しないのか、そしてこの長い「ウィーナー」を で動作させることができるかどうか、そして最終的にはどのように動作させるのかを調べたいと思います。まだ試していませんが、構造を使用し、for eachを使用してhead
動作することはほぼ確実です。オプションを とともに使用しても動作しません。主な問題は、 に出力が 1 つの連続ファイルとして供給されることだと思います(私が言った通りでしょうか、それとも「入力」でしょうか ?)。for
head
ping
xargs
-P
head
xargs
編集1: 私の目標は、一連の Web サイト アドレスの IP アドレスを取得し、それらの IP がどの組織に登録されているかを確認することです。これには、 を使用してwhois
その出力をパイプし、次にグループ化を行って、重複のない一意の名前のみを持つようにします。または の方がはるかに徹底的であることにはsed
同意しますが、Web サイトは十分に小さいため、ドメインごとに 1 つの IP アドレスしか見つからないことはほぼ確実です。それでも、他の人が提案したように、 ( または。まだ決めていません) を使用するつもりです。dig
host
ping
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