《轻松学linux》第四课、ip地址归属地查询


  • administrators

    上一节测试题目

    上一节测试题目都是将那些命令自己手动测试下。

    curl 命令

    curl命令是可以完成http和https协议的GET、POST、PUT等http请求的命令行工具,并且支持对请求设置代理。功能非常强大,可以用它来做linux的爬虫。由于今天我们不是主要介绍curl命令,所以我们只简单说下curl命令的GET请求。

    用curl 发送GET请求

    先看下命令:

    curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5
    

    上面这个命令,就是向http://ip.taobao.com/servicce/getIpInfo.php发送http的get请求,并且带有参数ip=223.5.5.5。执行命令后显示的结果就是返回的查询结果,其中-s参数是不显示进度日志。

    0_1478590377094_upload-8d5ec898-d4a8-4901-a988-36cb6200534e

    看上图可以看到ip.taobao.com给我们返回的数据是json格式(一种数据存储格式)的,我们要想看具体的地理位置需要对此数据进行处理分析,将地理位置筛选出来。所以,需要将这些输出交给一个jq工具进行处理。那么如何将数据交个jq呢?用|管道符就可以将curl的结果转交给jq

    |管道符

    | 这个竖线符合,在linux下有特殊意义,它就是管道符号。

    什么是管道

    我们如果把linux下的命令都比喻成一个净水器的滤芯,它们分别可以过滤水中不同的杂质,那么管道符合就相当于连接两个滤芯的水管。而这个水管内运送的水,就代表上一个滤芯的标准输出,由管道将此标准输出送给下一个滤芯。然后这些水作为下一个滤芯的标准输入。

    下面我们来简单演示下,先用vim test创建并编辑文件并输入下面内容:

    hello wrold
    hi 52robot.org
    

    cat命令可以查看文件内容

    #cat 命令可以将文件内容输出的终端
    cat test
    

    grep可以查找test文件含有52robot字符的行,并且在终端输出

    # grep "52robot" test
    

    上面我门了解了catgrep命令,现在我们就可以用|将他们连接起来。

    cat test| grep "52robot"
    

    这个操作是先有cat命令将test文件的内容放到标准输出,然后通过管道符合|传给grep作为它的标准输入,这样grep命令最后也就不用再写文件名了。

    发送请求并处理数据

    上面我们了解了管道符,下面我们用将curl的结果交给jq试下:

    curl http://-s ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.'
    

    0_1478592210648_upload-d0215e42-6406-44b4-a2e9-4f84699cf587

    这里我们简单介绍下jq怎么提取json里面的部分字段:
    我们把json的数据理解成一个树状结构的一个字典,其中.代表这个最顶级的一个字典。而
    .data代表json里面data关键字对应的键值;.data.country代表上文结果的中国.data.region代表上文的浙江省.data.city代表上文的杭州市
    下面我们再来试试:

    # 用+ 号可以将多个字段合并
    curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.data.country + .data.region + .data.city'
    

    0_1478592926028_upload-2da73045-2bf7-43b4-93ab-0bfb2bc6b657

    可以看到这个结果这就是我们想要的地理位置,它包括了国家、省、市。

    本节测试

    自己尝试改改输出,可以将所属区域和网络接入运营商也加入的查询的结果。

    下一节预告

    下节我们会将本节的这个命令写入脚本,让它支持传入IP参数,并同时可以直接作为系统命令来调用。

    视频



  • 向版主学习,版主加油啊


登录后回复

Looks like your connection to 首页 was lost, please wait while we try to reconnect.