字符串的第一个字母没有出现

时间:2016-12-11 06:33:23

标签: bash shell curl geolocation location

我正在为我的学校制作一份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

非常感谢任何帮助!

3 个答案:

答案 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')