sedを使用してpingコマンドからIPアドレスを抽出しますか? [繰り返し]

sedを使用してpingコマンドからIPアドレスを抽出しますか? [繰り返し]

サーバー上で実行されるBashツールを作成しました。このツールは、特定の時間範囲(午前5時から午後3時30分まで)内の特定のIPアドレスをブロックします。

現時点では、このツールはうまく機能しますが、特定のWebサイトのIPアドレスをテキストファイルに手動で入力し、ツールに "head"と"tail"コマンドを使用してn行目に基づいてIPアドレスを抽出する必要があります。私は単一のpingがより軽くて携帯性が良いと信じているので、これをしたくありません。したがって、Googleにpingを実行すると、次のようになります。

ping google.com -c 1 -s 16

出力は次のとおりです。

Ubuntu@yokai:~# ping google.com -c 1 -s 16
PING google.com (173.194.66.138) 16(44) bytes of data.
24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms

出力範囲を絞り込むコマンドは次のとおりです。

ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'

これは私に出力を与えます:

173.19.66.113173.19.66.113ubuntu@yokai

ご覧のとおり、同じIPアドレスが重複しています。単一のIPアドレスを変数に保存し、スクリプトをcronjobとして実行できるようにsedを使用して重複を削除するにはどうすればよいですか?それとも、より良い追跡のためにtrを使用できますか?

(編集する)

ホスト名またはドメインでIPアドレスを解決する方法を既に知っています。私がここに尋ねるのはそうではありません。この質問は、特に私が作成したツールの移植性を高めるためにsedを使用してping出力を管理することです。 pingはほぼすべてのLinuxディストリビューションのデフォルト値であるためです。

(更新)一部の人々は、この質問をそれとは何の関係もない他の無駄な質問の重複としてマークしたので、英語を理解するのが難しい精神遅滞者が理解できるように十分に明確に説明します。

どのように分析するこれ「唯一の」IPアドレス~からping 出力pingドメイン名に使用される場合。

ドメイン名を解決するための要求ではないので、重複ではありません!

sed(最新のアップデート)この質問で必要なことを達成するための正しいPOSIX正規表現を学んだので、元々はping出力から単一のIPインスタンスを印刷するための正規表現について質問したことを明確にする必要があります。それ以来、私はアプローチを改善し、ここで答えを使用しなくなりましたが、ここで助けを求めるすべての人の努力に感謝します。これで、特定のドメイン名解決をブロックするために、特定の時間にiptablesを設定するために作成したタイマースクリプトを使用しています。助けてくださった皆様にもよろしくお願いします。

答え1

pingICMP応答に基づいてホストが動作しているか無効になっているかを確認するために使用され、IPアドレスを確認するのに適したツールではなく、この目的のための特別なツールがあります。

あなたはそれを見なければなりませんdighost-nslookupあなたに最適なものは何でも良いです。

これはdig出力です:

% dig +short google.com
123.108.243.57
123.108.243.51
123.108.243.54
123.108.243.48
123.108.243.60
123.108.243.52
123.108.243.56
123.108.243.55
123.108.243.61
123.108.243.58
123.108.243.49
123.108.243.50
123.108.243.59
123.108.243.47
123.108.243.53

参考までに、Linux上でNSSwitch(ネームサービススイッチ)を介して照会するには、データベースと共に(または)コマンドを/etc/nsswitch使用します。例:getenthostsahosts

getent hosts google.com

マイコンピュータには次のものがあります。

hosts: files mdns4 dns

そのため、順番に照会して使用するか、/etc/nsswitch.conf名前に基づいて使用します。getent hostsgethostbyaddr(3)gethostbyname(3)ahostsgetaddrinfo(3)

デフォルトでは、私の設定に従って最初にチェックし、/etc/hostsmDNSをチェックし、最後にDNSをチェックします。


pingand 使用にこだわったら、sed次のようにすることができます。

% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56

答え2

Googleで検索して別のリンクを見つけました。unix.SE投稿言及getent- このようなプログラムがあるかどうかわからなかった。

getentlikeを使用してIPをホスト名として解決できますdig。私のシステムにはgetentデフォルトでインストールされていますが、そうではありませんdig。 ipv6ホスティングが必要なahostsv4場合ahostsv6

getent ahostsv4 google.com | awk '{print $1}' | head -1

正規表現/sedが良くなく、@heemaylの回答を把握できないため、この回答を追加しています。

答え3

1つの注意点は、dig@heemaylの出力に見られるように、一部のサイトに複数のIPアドレスがある可能性があることです。ping最初のアドレスのみが使用されるため、これらのアドレスをすべて取得するにはDNSルックアップを実行する必要があります。住所を具体的にリストするのではなく、主にリンクしたい他の項目にも当てはまります。

(また、Googleなどの場合は、現在地によって異なるIPアドレスを取得します。ここでは問題ではないかもしれませんが、注目に値します。)

もう一つは、あなたが使用したコマンドに関するものです。これは次のようになります。入力から、、、およびtr -d '(44):\n'文字のすべてのコピーを削除します。常に文字列ではなく単一文字を見てください。得られた出力を見ると、IPアドレスの途中でこの欠落していることがわかります。文字列操作などの他のツールを使用します。(4):\ntr4sed

さまざまな色を表示するために自転車倉庫、GNU grepを使用する別の簡単な方法があります。

$ ping google.com -c1 | head -1 | grep -Eo '[0-9.]{4,}'
172.217.22.174

関連情報