我正在为我的学校制作一份IP详细信息脚本,但我遇到了错误......
这是我的代码:
State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | cut -c42-999 |
grep '</li>' | grep 'e : ' -B 1 | awk '{gsub("</li>", "");print}' |
sed 's/[0-9]*//g' | awk '{gsub("e :", "");print}')
echo $State
我来自新南威尔士州的澳大利亚,但剧本只说
ew South Wales
非常感谢任何帮助!
答案 0 :(得分:2)
您可以使用W3C HTML-XML-utils中的hxpipe
(针对各种操作系统打包,例如针对Ubuntu为html-xml-utils
)。 hxpipe
将HTML转换为可用命令行工具解析的内容。
示例:
curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe | grep 'State/Province/'
-State/Province : Ontario
这更容易进一步处理,例如使用awk来获取冒号之后的所有内容:
$ curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe |
awk -F" *: *" '/State\/Province/ {print $NF}'
Ontario
这告诉awk字段由冒号分隔,由任意数量的空格包围。命令本身选择与State/Province
匹配的行(就像第一个示例中的grep命令一样),然后打印该行的最后一个字段。
答案 1 :(得分:0)
鉴于HTTP URI的输出似乎是复杂的HTML,其行如:
<21 spaces><li>State/Province : Western Australia</li>
我实际上无法看到该管道如何工作,因为您似乎切断了"State/Province : "
(可能W
(在您的情况下为N
))您甚至可以搜索包含"e :"
。
首先提取正确的行,然后使用比cut
更具适应性的命令抓取相关文本会好得多。
这样的事情应该是一个好的开始:
curl -s http://www.ipinfodb.com/my_ip_location.php
| awk '$1 == "<li>State/Province" && $2 == ":" {
$1 = "";
$2 = "";
gsub ("</li>", "");
print
}
{}'
| sed 's/^ *//'
awk
是单命令,它会选择前两列与您需要的行匹配的行,将这些列设置为空字符串,删除</li>
结束标记并输出结果。
sed
将简单地删除前导空格,因为awk
仍然会在开始时在空列之间输出空格。
这样,你就不必担心线条格式的微小变化,例如,如果它们开始放入更多的空格或用制表符而不是空格缩进。您仍然需要担心主要更改,例如更改"State/Province"
位,但它们的可能性要小得多。
答案 2 :(得分:0)
sed
通常不是解析HTML的好工具,但它可以帮助解决这个简单的问题。试试这个:
State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*<li>State\/Province : \([^<]*\)<\/li>.*/\1/p')
由于字符串State/Province
仅在页面中出现一次,因此该字符串也应该起作用:
State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*State\/Province : \([^<]*\)<.*/\1/p')