我想在ipinfo.io上批量查找ip详细信息。这是我的代码。$ cat ips.txt | xargs -I% curl http://ipinfo.io/%/region
文件"ips.txt"包含三个ip地址,每个地址位于一行:(1) 8.8.8.8(2) 8.8.4.4(3) 1.2.3.4
这只解析最后一个ip地址。它应该给(1)加利福尼亚州(2)科罗拉多州(3)华盛顿州。我得到以下信息:
curl:(3)在URL中发现非法字符curl:(3)在URL中发现非法字符华盛顿
如果我只写一个ip地址的ips.txt(例如8.8.8.8),我会得到很好的结果。我认为我的文本文件或我使用cat的方式有问题。你能帮我清理代码,这样三个ip地址都能解决吗?
根据请求,以下是我的设置详细信息。
$ uname -a
CYGWIN_NT-10.0 OFFICECOMP 2.3.1(0.291/5/3) 2015-11-14 12:44 x86_64 Cygwin
$ curl -V
curl 7.45.0 (x86_64-unknown-cygwin) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 lib idn/1.29 libssh2/1.5.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: Debug IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets Metali
因此,作为一步一步的总结,
运行uname -A
可以显示正在使用的系统,例如在这里显示它是Cygwin。
这让我们思考Windows与Linux的区别。
已知的区别之一是windows/dos行的结尾。这可以揭示,以及通常检查文本文件的所有内容,使用:
cat -A ips.txt
现在,如果你发现它包含^M
行结尾,就像这里一样,这意味着行结尾是dos/windows,而不是*nix行结尾(只显示以$
结尾的行)
要解决此问题,只需运行
dos2unix ips.txt
现在,如果您使用这个固定的输入文件运行原始命令,CURL似乎对此很满意,并且它可以工作。
也谢谢你,MistaGill,我从这篇文章中了解到了ipinfo.io
。
我遇到了类似的情况,一个可能的快速解决方案是在xargs
:中添加-d "n"
标志
cat ips.txt | xargs -d "n" -I% curl http://ipinfo.io/%/region
这样可以防止新行被解释为传递给curl
的参数的一部分。