プロセスを自動化したい。
カール要求に使用するIPアドレスのリストがあります。
curl http://api.geoiplookup.net/?query=($ip)
カールの出力から都市を取得し、フォーマットでテキストファイルに1行を書きたいです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 のような 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
1行に1つのアドレスがあるとし、ファイル内のすべての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