背景描述
前段时间,接到一个小需求:给你少量商家的手机号,要查出系统对应用户id。
这种需求其实很简单,有现成的resetful接口,直接请求返回结果,解析其中的id信息拿出来就好了。
但是处理起来比较尴尬,专门写个脚本有点杀鸡用牛刀的感觉,无奈找不到更好的方案,只能先写个脚本把需求解决了先。
更优雅的方法
周末有时间,又想起这事情来,这种需求查询量不大,功能也简单,其实完全可以用一条命令就能解决的。而且之前刚刚看了xargv和sed的基础用法,处理起来应该绰绰有余。
需求重现
给你一批手机,调用淘宝的接口
http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443
查询这批手机号的地区id。
准备数据
先从网上随便找20个手机号当输入源
18920211520
13819920502
18070062222
17674077773
17612951295
13631333353
18015028188
13500035477
13762925555
18661778179
18661778177
18866001177
18866001177
18571871877
18903717108
17768699777
15874611777
14576399999
15565556566
18888688888
将这些保存到inputSource文件里。
用xargv拼接请求
cat inputSource | xargs -I {} curl 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}'
过滤curl的结果
cat inputSource | xargs -I {} curl 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid
这时却发现出现了我们不需要的输出
######################################################################## 100.0%
网上google一下,发现可以用--silent参数,于是得到
cat inputSource | xargs -I {} curl --silent 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid
用awk处理字符
先用awk试个手
cat inputSource | xargs -I {} curl --silent 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid | awk '{print $1}'
把前面的tab符去掉了。
再把单引号作为字符分隔符来处理:
cat inputSource | xargs -I {} curl --silent 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid | awk 'BEGIN{FS="'"} {print $2}'
不成功,提示等待输入结束的单引号,是引入了'的缘故。
既然'有问题,先退一步,换个字符试试分隔符用的对不对。
cat inputSource | xargs -I {} curl --silent 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid | awk 'BEGIN{FS=":"} {print $2}'
用:没问题,离成功又近了一步。再去google一下,怎么指定单引号为分隔符。发现是\047,于是得到最后的命令
cat inputSource | xargs -I {} curl --silent 'http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={}' | grep areaVid | awk 'BEGIN{FS="\047"} {print $2}'