xargs ping 및 헤드 출력을 예상대로 만드는 방법은 무엇입니까?

xargs ping 및 헤드 출력을 예상대로 만드는 방법은 무엇입니까?

도메인 집합이 주어지면 해당 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첫 번째 줄을 인쇄한 후 종료하고 xargsSIGPIPE를 기록기( )에 보내 자신이 쓴 내용을 읽을 수 있는 프로세스가 없음을 나타냅니다. 이에 대한 응답으로 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

관련 정보