도메인 집합이 주어지면 해당 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
모든 ping
. xargs
이 옵션과 함께 사용해 -P
도 아무런 효과가 없습니다. 주요 문제는 head
출력을 하나의 연속 파일로 제공하는 것 입니다 xargs
(제 말이 맞나요, 아니면 "입력"인가요?).
편집 1: 내 목표는 웹 사이트 주소 집합의 IP 주소를 얻은 다음 whois
출력을 사용하고 파이핑하여 해당 IP가 어떤 조직에 등록되어 있는지 확인한 sed
다음 고유한 이름만 있고 중복되지 않도록 그룹화를 수행하는 것입니다. . 나는 동의 dig
하거나 host
그보다 더 철저 ping
하지만 이러한 사이트는 도메인당 하나의 IP 주소만 찾을 수 있을 정도로 작다고 확신합니다. 그래도 지금은 다른 사람들이 제안한 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