我正在尝试解析从curl请求返回的JSON,如下所示:
curl 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
上面将JSON分为多个字段,例如:
% ... "geo_enabled":false "friends_count":245 "profile_text_color":"000000" "status":"in_reply_to_screen_name":null "source":"web" "truncated":false "text":"My status" "favorited":false % ...
如何打印特定字段(以表示-v k=text)?
-v k=text
有许多专门用于从命令行操作JSON的工具,它们比使用Awk进行操作要容易和可靠得多,例如jq:
jq
curl -s 'https://api.github.com/users/lambda' | jq -r '.name'
您还可以使用系统上可能已经安装的工具(例如使用json模块的 Python)来执行此操作,从而避免任何额外的依赖关系,同时仍然可以使用适当的JSON解析器。以下假设您要使用UTF-8,原始JSON应该用UTF-8编码,这也是大多数现代终端所使用的:
json
Python 3:
curl -s 'https://api.github.com/users/lambda' | \ python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"
Python 2:
export PYTHONIOENCODING=utf8 curl -s 'https://api.github.com/users/lambda' | \ python2 -c "import sys, json; print json.load(sys.stdin)['name']"
该答案最初推荐jsawk,它应该仍然有效,但是使用起来要麻烦一些jq,并且取决于安装的独立JavaScript解释器(比Python解释器少见),因此上述答案可能更可取:
curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'
这个答案最初也使用了问题中的Twitter API,但是该API不再起作用,因此很难复制示例进行测试,而新的Twitter API需要API密钥,因此我改用了GitHub API无需API密钥即可轻松使用。原始问题的第一个答案是:
curl 'http://twitter.com/users/username.json' | jq -r '.text'