如何讓 xargs ping 和 head 輸出符合預期?

如何讓 xargs ping 和 head 輸出符合預期?

給定一組網域,我想取得它們的 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構造並使用headfor every 來工作pingxargs與該選項一起使用-P也不起作用。我想主要問題是head將輸出作為一個連續文件提供xargs(我說得對還是“輸入”?)。

EDIT1:我的目標是取得一組網站位址的 IP 位址,然後透過使用whois和管道輸出來檢查這些 IP 也註冊到哪些組織sed,然後可能進行一些分組,這樣我只有唯一的名稱,沒有重複。我同意dighost比這一點更徹底,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

相關內容