
給定一組網域,我想取得它們的 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
.現在我想探討為什麼它不起作用,以及我是否以及最終如何使這個長“wiener”與head
.我還沒有嘗試過,但我很確定它可以使用for
構造並使用head
for every 來工作ping
。xargs
與該選項一起使用-P
也不起作用。我想主要問題是head
將輸出作為一個連續文件提供xargs
(我說得對還是“輸入”?)。
EDIT1:我的目標是取得一組網站位址的 IP 位址,然後透過使用whois
和管道輸出來檢查這些 IP 也註冊到哪些組織sed
,然後可能進行一些分組,這樣我只有唯一的名稱,沒有重複。我同意dig
或host
比這一點更徹底,ping
但我相當肯定這些網站足夠小,每個網域只能找到 IP 位址。儘管如此,我想現在我會按照其他人的建議去做dig
(或者host
;我還沒決定)。
為了弄清楚為什麼我對使用感興趣head
而不是grep
為了我需要的東西:我只是好奇它會如何完成(我對 bash 和 Linux 總體來說很陌生)並且我覺得它可能會澄清管道的工作原理。就這樣
答案1
head -n 1
在列印第一行後退出,並向 writer ( xargs
) 發送 SIGPIPE 來表示沒有進程可以讀取它所寫入的內容。作為回應,xargs
執行大多數進程執行的操作並終止其子進程 ( ping
),列印警告,可能將 SIGPIPE 傳送到其自己的父進程,然後終止自身。
但是,您會注意到,由於您尚未pipefail
在腳本中設置,因此完整腳本的退出代碼為零 -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