从JSON列表中提取键值?

从JSON列表中提取键值?,json,awk,sed,apache-nifi,Json,Awk,Sed,Apache Nifi,我需要从JSON文件textuploader.com/1dchq中提取id的“name”:“consumerkafka”,这样它就会给出结果: “id”:“772658d2-8510-3834-856b-6cfd7e8871f6” 由于限制,我不能使用任何第三方工具。如何使用sed/awk执行此操作?从文本文件可以执行以下操作: awk '/"id"/ {print $1}' file "id":"67e21117-891e-3019-8926-7571b3b0317f", "id":"67e2

我需要从JSON文件textuploader.com/1dchq中提取
id
“name”:“consumerkafka”
,这样它就会给出结果:
“id”:“772658d2-8510-3834-856b-6cfd7e8871f6”


由于限制,我不能使用任何第三方工具。如何使用sed/awk执行此操作?

从文本文件可以执行以下操作:

awk '/"id"/ {print $1}' file
"id":"67e21117-891e-3019-8926-7571b3b0317f",
"id":"67e21117-891e-3019-8926-7571b3b0317f",
"id":"67e21117-891e-3019-8926-7571b3b0317f",
"id":"67e21117-891e-3019-8926-7571b3b0317f",
"id":"a1c4b268-3a6f-3b4c-bf12-0ded10f5d767",
"id":"a1c4b268-3a6f-3b4c-bf12-0ded10f5d767",
"id":"a1c4b268-3a6f-3b4c-bf12-0ded10f5d767",
"id":"a1c4b268-3a6f-3b4c-bf12-0ded10f5d767",
"id":"772658d2-8510-3834-856b-6cfd7e8871f6",
"id":"772658d2-8510-3834-856b-6cfd7e8871f6",
"id":"772658d2-8510-3834-856b-6cfd7e8871f6",
"id":"772658d2-8510-3834-856b-6cfd7e8871f6",
  • -F'[”:,]+'
    -使用任意数量的双引号、冒号或逗号作为字段分隔符

  • $2==“id”{id=$3}
    -如果第二个字段正好是
    id
    ,请保存下一个字段

  • $2==“name”&&&$3==“consumerkafka”{print id}
    -根据字段2和3打印保存的id


如果您只需要第一个匹配项,请执行
{print id;exit}

您可以使用
EvaluateJSONPath
处理器将JSON值提取到流文件属性中。使用JSONPath表达式
$.processors[?(@.component.name==“ConsumeKafka”)].component.id
ConsumeKafka
id
提取到流文件上的属性


另一方面,我认为您使用的API响应太通用且太大,无法提供帮助。您可以通过进行更具体的API调用来限制JSON响应中返回的信息更具体。

我正在Nifi中自动部署,因此无法使用其他处理器。使用REST/Nifi toolkit是正确的方法现在。Hi@vintnes,这对于以漂亮的json格式输出的文件来说确实有效。但是,当我转换实际文件时,它不是以漂亮的格式(),它不起作用。因此,我尝试使用python工具
python-m json.tool
将其转换为漂亮的json格式,但在转换后的文件上也不起作用。我做错了什么?@EdMorton我已经修复了示例。我本想使用
jq
,但我们的组织尚未批准它。明白。是的,python抱歉,这不是StackOverflow的工作方式。表格“我想做X,请给我提示和/或示例代码”中的问题被视为离题。请访问并阅读,尤其是阅读
$ awk -F '[":,]+' '$2=="id" {id=$3} $2=="name" && $3=="ConsumeKafka" {print id}' file
772658d2-8510-3834-856b-6cfd7e8871f6
772658d2-8510-3834-856b-6cfd7e8871f6
772658d2-8510-3834-856b-6cfd7e8871f6