
도메인 배열이 주어지면 다음 형식으로 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
foreach를 사용하면 작동할 것이라고 확신합니다 ping
. 옵션 xargs
과 함께 사용해 -P
도 작동하지 않습니다. 주요 문제는 출력이 하나의 연속 파일로 head
공급된다는 것입니다 xargs
(내가 옳다고 말했습니까, 아니면 "입력"입니까?).
편집 1: 내 목표는 웹사이트 주소 집합의 IP 주소를 얻은 다음 whois
출력을 사용하고 파이프하여 해당 IP가 등록된 조직이 무엇인지 확인한 sed
다음 일부 그룹화를 수행하여 반복되지 않고 고유한 이름만 갖도록 하는 것이었습니다. 나는 이에 동의 dig
하거나 host
그보다 훨씬 더 철저 ping
하지만 웹사이트가 각 도메인에 대해 하나의 IP 주소만 찾을 수 있을 만큼 충분히 작다고 확신합니다. 그럼에도 불구하고 이제는 다른 사람들이 제안한 대로 dig
(또는 host
; 아직 결정하지 않음) 로 갈 것이라고 생각합니다 .
head
내가 필요한 것이 아닌 사용에 관심이 있는 이유를 명확하게 하기 위해 grep
: 나는 그것이 어떻게 수행될 것인지 궁금합니다(나는 일반적으로 bash와 Linux를 처음 접했습니다). 파이핑이 어떻게 작동하는지 명확하게 할 수 있을 것이라고 느꼈습니다. 그게 다야
답변1
head -n 1
첫 번째 줄이 인쇄된 후 종료되고 SIGPIPE를 작성기( xargs
)에게 보내 무엇이든 읽을 수 있는 프로세스가 남아 있지 않음을 알립니다. 이에 대한 응답으로 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