Grep

從 curl 響應中提取兩個字元串,將它們輸出到同一行的文件中

  • May 19, 2020

我想自動化一個過程。

我有一個用於 curl 請求的 IP 地址列表:

curl http://api.geoiplookup.net/?query=($ip)

從 curl 的輸出中,我想抓取城市並將一行寫入格式為IP_address:city.

為了 grep 我發現了這個城市(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命令時,它不會顯示城市並給出錯誤。

非常感謝。

首先,總是引用命令行中給出的 URL。某些 URL 可能包含字元&,shell 會解釋它,就像您要啟動後台作業一樣。某些 URL,例如您顯示的 URL,包含文件名萬用字元,並且某些 shell 會根據它們的配置嘗試將它們與目前目錄中的文件進行匹配,如果沒有匹配,則可能會失敗並出現錯誤:

$ 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

要遍歷文件中的所有 IP 地址essai,假設每行有一個地址:

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

引用自:https://unix.stackexchange.com/questions/587596