프로세스를 자동화하고 싶습니다.
컬 요청에 사용할 IP 주소 목록이 있습니다.
curl http://api.geoiplookup.net/?query=($ip)
컬의 출력에서 도시를 가져와서 형식으로 텍스트 파일에 한 줄을 쓰고 싶습니다 IP_address:city
.
도시를 찾기 위해 다음을 찾았습니다(google 예).
curl http://api.geoiplookup.net/?query=216.58.198.206 | grep -oP '(?<=\<city\>).*(?=\<\/city\>)'
내가 수행한 프로세스를 자동화하려면(그러나 개선이 필요합니다^^):
for ip in $(cat essai); do curl http://api.geoiplookup.net/?query=$ip & done
명령을 추가하려고 하면 grep
도시가 표시되지 않고 오류가 발생합니다.
감사합니다.
답변1
먼저 명령줄에 제공된 URL을 항상 인용하세요. 일부 URL에는 &
셸에서 백그라운드 작업을 시작한다는 의미로 해석되는 문자가 포함될 수 있습니다. 표시된 것과 같은 일부 URL에는 파일 이름 와일드카드 문자가 포함되어 있으며 일부 셸(구성에 따라 다름)은 이를 현재 디렉터리의 파일과 일치시키려고 시도하며 일치하지 않으면 실수로 실패할 수 있습니다.
$ curl http://api.geoiplookup.net/?query=216.58.198.206
zsh: no matches found: http://api.geoiplookup.net/?query=216.58.198.206
응답의 XML 문서에서 IP 주소와 도시를 구문 분석하려면 다음을 사용하세요 xmlstarlet
.
$ curl -s "http://api.geoiplookup.net/?query=$ipaddr" | xmlstarlet sel -t -m '//result' -v 'concat(host, ":", city)' -nl
216.58.198.206:Mountain View
essai
한 줄에 하나의 주소가 있다고 가정하고 파일의 모든 IP 주소를 반복합니다 .
while IFS= read -r ipaddr; do
curl -s "http://api.geoiplookup.net/?query=$ipaddr" |
xmlstarlet sel -t -m '//result' -v 'concat(host, ":", city)' -nl
done <essai