컬 응답에서 두 개의 문자열을 Grep하여 같은 줄의 파일로 출력합니다.

컬 응답에서 두 개의 문자열을 Grep하여 같은 줄의 파일로 출력합니다.

프로세스를 자동화하고 싶습니다.

컬 요청에 사용할 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

관련 정보