Bash中类似JSON的键值对的有条件grep值

Bash中类似JSON的键值对的有条件grep值,json,bash,grep,Json,Bash,Grep,我正在使用一个返回JSON数据的API。数据的结尾通常缺少几个字符,因此从技术上讲,它类似于JSON,因为它的格式有点不正确 我可以使用grep从中提取感兴趣的字段,就像在我的Bash脚本中这样: grep -Po '"username": *\K"[^"]*"' jsonraw > jsonclean 尽管JSON被略微截断,但它仍然可以正常工作。唯一的问题是它返回每一条记录,而我想让它以另一个键值对为条件 例如,我希望它仅在activ

我正在使用一个返回JSON数据的API。数据的结尾通常缺少几个字符,因此从技术上讲,它类似于JSON,因为它的格式有点不正确

我可以使用grep从中提取感兴趣的字段,就像在我的Bash脚本中这样:

grep -Po '"username": *\K"[^"]*"' jsonraw > jsonclean
尽管JSON被略微截断,但它仍然可以正常工作。唯一的问题是它返回每一条记录,而我想让它以另一个键值对为条件

例如,我希望它仅在activity_count字段>=1时返回用户名值,否则跳过记录。一些表示这一点的伪代码可能如下所示:

if  '"activity_count":' >=1 grep -Po '"username": *\K"[^"]*"' jsonraw > jsonclean
我意识到jq可能是一个更简单的选择,但我更喜欢使用grep,因为JSON数据的格式不正确以及其他原因

样本数据:

[
{"id":"37da1db11b6b4977902baa286f88bf05","activity_count":0,"blocked":false,"coverPhoto":"cb861013bdcc4e5f9e2a93394a7b4309","followed":true,"human":true,"integration":false,"joined":"20190602125229","muted":false,"name":"AV8R","rss":false,"private":false,"profilePhoto":"511d4625df2442fc9b02ab4279c28f09","subscribed":false,"username":"APALMER66","verified":false,"verifiedComments":false,"badges":[0],"score":"1.4k","interactions":259},{"id":"525f9e87bb2d4f4184d12037050afc8d","activity_count":2,"blocked":false,"coverPhoto":"b0bbb4dec22f40d6a347dfb666ff0158","followed":true,"human":true,"integration":false,"joined":"20200627154134","muted":false,"name":"DeziRay","rss":false,"private":false,"profilePhoto":"86627047425844fcbf921e53fc71d106","subscribed":false,"username":"Deziray","verified":false,"verifiedComments":false,"badges":[0],"score":"4.7k","interactions":259},
预期产出:

Deziray

首先,因为更简单,jq的回答是:


因为它是在流模式下运行的,所以它甚至可以处理被截断的文档。

首先,因为它更简单,jq回答:


因为它在流模式下运行,所以它甚至能够处理被截断的文档。

作为本机Python实现,依赖于现代Python 3.x运行时:

!/usr/bin/env蟒蛇3 导入json,sys 已找到def_obj_cb项目: 如果item.get'activity_count',0>=1且item中的'username': printitem['username'] 退货项目 尝试: json.loadsys.stdin,object\u hook=found\u obj\u cb 除了json.JSONDecodeError: 通过 …从shell中用作:

!/usr/bin/env bash
json_parse_py=$cat作为本机Python实现,依赖于现代Python 3.x运行时:

!/usr/bin/env蟒蛇3 导入json,sys 已找到def_obj_cb项目: 如果item.get'activity_count',0>=1且item中的'username': printitem['username'] 退货项目 尝试: json.loadsys.stdin,object\u hook=found\u obj\u cb 除了json.JSONDecodeError: 通过 …从shell中用作:

!/usr/bin/env bash
json_parse_py=$cat FWIW,如果使用流模式,一个不关心文档结尾格式错误的jq答案是可行的……或者,你对Python还满意吗?还有一些基于流的Python JSON解析器可用,比如,构建一个外壳函数,用其中一个封装一个简短的Python脚本是相当简单的。感谢JalsDuffy关于JQ的信息,如果没有一个好的GRIP答案,我可能会考虑它,但是还有一些其他的原因我想坚持GRIP,就像它已经存在于任何Linux系统中,所以代码在不必安装它的情况下是可以工作的。Python也是如此,不过我个人确实很喜欢Python。如果可以的话,我只是想让脚本不受依赖。啊-好吧,这比我当时想的要复杂一点,谢谢你的澄清…在开始时添加了一个jq答案,当我有机会时,我会尝试查看Python的答案。FWIW,一个不关心文档格式错误结尾的jq答案是可行的,如果使用流模式……或者,你对Python还满意吗?还有一些基于流的Python JSON解析器可用,比如,构建一个外壳函数,用其中一个封装一个简短的Python脚本是相当简单的。感谢JalsDuffy关于JQ的信息,如果没有一个好的GRIP答案,我可能会考虑它,但是还有一些其他的原因我想坚持GRIP,就像它已经存在于任何Linux系统中,所以代码在不必安装它的情况下是可以工作的。Python也是如此,不过我个人确实很喜欢Python。如果可以的话,我只是想让脚本不受依赖。啊-好吧,这比我当时想的要复杂一点,谢谢你的澄清…在开始时添加了一个jq答案,我会在有机会的时候尝试看看Python的答案。这太好了,谢谢你。如果有人有一个grep的答案,这仍然是有用的,我可能不得不越过绿色的复选标记-但这是目前的工作,再次感谢。这是伟大的,谢谢你。如果有人有一个grep的答案,这仍然是有用的,我可能不得不越过绿色的复选标记-但这是目前的工作,再次感谢。
jq -nr --stream '
fromstream(1|truncate_stream(inputs))
| select(.activity_count >= 1)
| .username
' <test.json