分析 curl 结果时遇到的问题

请求一个curl结果

var=`curl -l "http://www.kuaidi100.com/query?type=yuantong&postid=11111111111"`

意图是想对返回的json数据进行如下处理:
匹配出结果中的几对key-value

#错误示例
$val | grep -o -P '\"abstract\":.*?(?=,)'

结果是提示文件名过长,且可能存在的空格会导致commond not found
显然这里我是使用错误了

将请求的结果保存在文件中再读取:

cat file |  grep -o -P '\"abstract\":.*?(?=,)'

可以取到结果,但事实上整个流程是在循环中进行的

sudo rm -rf data/res.log
while read query
    do
        var=$(command)
        echo 'kw:'$query',var:'$var >> data/res.log;
    done < querys.log

还是希望能直接在循环中直接处理完结果

尝试把grep的操作拼接在var中即:

var=`curl -l "http://www.kuaidi100.com/query?type=yuantong&postid=11111111111" | grep -o -P '\"context\":.*?(?=,)'`
#之前随便找的一个api接口,没想到失效了,这里备一份
{
    "message": "ok",
    "nu": "11111111111",
    "ischeck": "1",
    "com": "yuantong",
    "status": "200",
    "condition": "F00",
    "state": "3",
    "data": [
        {
            "time": "2020-01-09 09:43:08",
            "context": "查无结果",
            "ftime": "2020-01-09 09:43:08"
        }
    ]
}

确实可以取到想要的结果。
但是,如果想要取多对数据应该怎么处理?
望不吝赐教,感谢!

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

原始问题中使用 shell 的 grep ,grep 确实学习起来有些困难,是个渐进和经验积累的过程。就处理json来说支持楼上建议。就作者原始问题,我有个使用 grep 的解决办法,抛砖引玉。

原问中处理的关键是 grep ,而且使用 -o 选项保证只输出匹配,-P 选项使用 perl 语言正则表达式,这里它主要使用了 perl 中的锚定断言功能,即正则表达式最后的 '?(?=,)' 那部分。

对于想取多对数据的需要,我们可以使用正则中''匹配功能,如上问题中提供的网址取回的json数据,想取 ftimecontextlocation 的键值对,可将正则表达式写成 '\"(ftime|context|location)\":.*?(?=,|})' ,可试试如下2个命令:

$ var=`curl -l "http://www.kuaidi100.com/query?type=yuantong&postid=11111111111"` 
$ echo $var | grep -o -P '\"(ftime|context|location)\":.*?(?=,|})'

我的输出:

"ftime":"2020-01-13 20:02:36"
"context":"【嘉兴市】 快件离开 【嘉兴中转部】 已发往 【广州中心】"
"location":""
"ftime":"2020-01-13 20:00:41"
"context":"【嘉兴市】 快件已经到达 【嘉兴中转部】"
"location":""
"ftime":"2020-01-13 18:21:01"
"context":"【嘉兴市】 快件离开 【平湖】 已发往 【佛山中心】"
"location":""
"ftime":"2020-01-13 17:26:25"
"context":"【嘉兴市】 【平湖】(0573-85095087、0573-85086225) 的 小范(15857303586) 已揽收"
"location":""

不知是否是需要的结果。

4年前 评论
crhhoho (楼主) 4年前
讨论数量: 3

你输入的命令可以给出相应的结果!

下面是我对问题的回答:

  • 该链接http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600, 我开始访问是返回errno 2, 通过搜索知道这是百度百科的接口,可能还要权限, 然后就无法知道该JSON数据格式。
  • 对于一个JSON数据,要原生操作需要技巧,可使用awk,但想简单处理应该使用别人的轮子,比如 jq (shell下的json解释)。
  • 最后实觉得linux下处理麻烦,可使用python,网络请求,处理json易如反掌。
4年前 评论
crhhoho (楼主) 4年前

原始问题中使用 shell 的 grep ,grep 确实学习起来有些困难,是个渐进和经验积累的过程。就处理json来说支持楼上建议。就作者原始问题,我有个使用 grep 的解决办法,抛砖引玉。

原问中处理的关键是 grep ,而且使用 -o 选项保证只输出匹配,-P 选项使用 perl 语言正则表达式,这里它主要使用了 perl 中的锚定断言功能,即正则表达式最后的 '?(?=,)' 那部分。

对于想取多对数据的需要,我们可以使用正则中''匹配功能,如上问题中提供的网址取回的json数据,想取 ftimecontextlocation 的键值对,可将正则表达式写成 '\"(ftime|context|location)\":.*?(?=,|})' ,可试试如下2个命令:

$ var=`curl -l "http://www.kuaidi100.com/query?type=yuantong&postid=11111111111"` 
$ echo $var | grep -o -P '\"(ftime|context|location)\":.*?(?=,|})'

我的输出:

"ftime":"2020-01-13 20:02:36"
"context":"【嘉兴市】 快件离开 【嘉兴中转部】 已发往 【广州中心】"
"location":""
"ftime":"2020-01-13 20:00:41"
"context":"【嘉兴市】 快件已经到达 【嘉兴中转部】"
"location":""
"ftime":"2020-01-13 18:21:01"
"context":"【嘉兴市】 快件离开 【平湖】 已发往 【佛山中心】"
"location":""
"ftime":"2020-01-13 17:26:25"
"context":"【嘉兴市】 【平湖】(0573-85095087、0573-85086225) 的 小范(15857303586) 已揽收"
"location":""

不知是否是需要的结果。

4年前 评论
crhhoho (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!