在Unix系统中如何不使用jq从JSON文件提取byteCount值?
如何在无jq工具时用sed或grep提取JSON中的byteCount值
假设你有这样的JSON内容:
{ "listingRequest": { "id": "016a1050-82dc-1262-cc9b-4baf3e0b7123", "uri": "http://localhost:9090/nifi-api/flowfile-queues/016a104a-82dc-1262-7d78-d84a704abfbf/listing-requests/016a1050-82dc-1262-cc9b-4baf3e0b7123", "submissionTime": "04/28/2019 19:40:58.593 UTC", "lastUpdated": "19:40:58 UTC", "percentCompleted": 0, "finished": false, "maxResults": 100, "state": "Waiting for other queue requests to complete", "queueSize": { "byteCount": 480, "objectCount": 20 }, "sourceRunning": false, "destinationRunning": false } }
你想要提取byteCount对应的数值480,但因为公司限制没法用jq这类工具,之前尝试的grep -Po '"byteCount":.*?[^\\]",'没得到输出,下面给你两个可行的方案:
方案一:使用grep的Perl正则模式
你之前的命令问题在于正则匹配的范围不对,我们可以调整正则,精准定位到byteCount后的数值:
grep -Po '"byteCount":\s*\K\d+' your_json_file.json
-P:启用Perl兼容正则表达式-o:只输出匹配的部分\K:忽略前面匹配的内容(也就是"byteCount":和可能的空格),只保留后面的数字部分
如果是直接从管道输入(比如通过curl获取的内容),可以这样用:
echo '你的JSON内容' | grep -Po '"byteCount":\s*\K\d+'
方案二:使用sed命令
如果你的环境里grep不支持-P参数,也可以用sed来实现:
sed -n 's/.*"byteCount":\s*\([0-9]*\).*/\1/p' your_json_file.json
-n:不默认输出每一行s/.../.../p:替换模式,把整行内容替换成我们捕获的数字部分,然后打印出来\([0-9]*\):捕获byteCount后面的数字,\1引用这个捕获的内容
同样,管道输入的话:
echo '你的JSON内容' | sed -n 's/.*"byteCount":\s*\([0-9]*\).*/\1/p'
这两个命令都能帮你直接得到480这个结果,而且不需要额外安装工具,完全依赖系统自带的grep和sed。
内容的提问来源于stack exchange,提问作者dijeah
相关产品推荐
相关产品推荐

