在反向GREP之后使用JQ解析并返回正确的JSON

在反向GREP之后使用JQ解析并返回正确的JSON,json,shell,grep,jq,tmux,Json,Shell,Grep,Jq,Tmux,我一直在为一些看似简单的事情苦苦挣扎 每天我都会使用iOs快捷方式监控我的一台服务器,而快捷方式应用程序在处理JSON对象时非常挑剔 我需要返回一个完全格式化(没有嵌套)的数组;i、 e: { { "term": "alpha" }, { "term": "beta" }, { "term": "gamma" }, } 数据是从

我一直在为一些看似简单的事情苦苦挣扎

每天我都会使用iOs快捷方式监控我的一台服务器,而快捷方式应用程序在处理JSON对象时非常挑剔

我需要返回一个完全格式化(没有嵌套)的数组;i、 e:

{
  {
    "term": "alpha"
  },
  {
    "term": "beta"
  },
  {
    "term": "gamma"
  },
}
数据是从一个内部API调用获取的,我需要从已经存在的术语中过滤掉其中的值。 我想知道从API返回的哪些对象当前不是运行同名tmux的对象

以下是API调用的非格式化返回:

{
  "online_terms": [
    {
      "term": "alpha"
    },
    {
      "term": "beta"
    },
    {
      "term": "gamma"
    }
  ],
  "total": 3,
}
以下是当前使用的一个班轮:

list=$(tmux list-sessions -F \#S); curl https://myapi.call| jq -r '.online_terms[] | .term' | grep -v $list
$列表将包含当前正在运行的tmux会话的多行LS样式名称。i、 e:

alpha
omega
kappa
到目前为止,我一直在用这个,但充其量也很古怪。为了澄清,将我的所有tmux会话声明到$list变量中,然后执行API调用,解析出我需要的嵌套值,根据$list反向grep。。。不理想

它只返回单行名称,即(过滤掉的alpha):

我无法将其解析为上面解释的对象类型,尽管我多次尝试将原始数据读回JQ


对于如何更清晰地反向greptmux ls值,或者如何解析为正确的JSON对象,我欢迎您提供任何建议,提前感谢您的帮助

为了说明如何在没有任何黑客攻击的情况下使用jq解决问题,我们首先假设黑名单以某种方式作为文本文件提供,比如blacklist.txt:

alpha
omega
kappa
curl https://myapi.call |
 jq -r '[.online_terms[].term] | sort[]' |
 comm -23 - <(sort blacklist.txt) |
 jq -Rn '[{term: inputs}]' 
然后,您可以使用jq的调用,如下所示:

< blacklist.txt jq --argjson curl "$(curl https://myapi.call)" -Rn '
  [inputs] as $blacklist
  | [ $curl
      | .online_terms[]
      | select( .term | IN($blacklist[]) | not) ]'

不太好看,但它强调了一个事实,即如果您的黑名单生成器可以将黑名单作为JSON提供,事情会变得更简单。

为了说明如何使用jq来解决问题而不使用任何黑客,让我们首先假设黑名单以某种方式作为文本文件提供,比如blacklist.txt:

alpha
omega
kappa
curl https://myapi.call |
 jq -r '[.online_terms[].term] | sort[]' |
 comm -23 - <(sort blacklist.txt) |
 jq -Rn '[{term: inputs}]' 
然后,您可以使用jq的调用,如下所示:

< blacklist.txt jq --argjson curl "$(curl https://myapi.call)" -Rn '
  [inputs] as $blacklist
  | [ $curl
      | .online_terms[]
      | select( .term | IN($blacklist[]) | not) ]'

不太好看,但它强调了一个事实,即如果您的黑名单生成器可以将黑名单作为JSON提供,事情会变得更简单。

提供以下解决方案主要是因为它与OP提出的解决方案类似,尽管它使用
comm
而不是
grep
,并假设黑名单位于文本文件blacklist.txt中:

alpha
omega
kappa
curl https://myapi.call |
 jq -r '[.online_terms[].term] | sort[]' |
 comm -23 - <(sort blacklist.txt) |
 jq -Rn '[{term: inputs}]' 
curlhttps://myapi.call |
jq-r'[.online_terms[].term]| sort[]|

comm-23-提供以下解决方案主要是因为它与OP提出的解决方案类似,尽管它使用
comm
而不是
grep
,并且假设黑名单位于文本文件blacklist.txt中:

alpha
omega
kappa
curl https://myapi.call |
 jq -r '[.online_terms[].term] | sort[]' |
 comm -23 - <(sort blacklist.txt) |
 jq -Rn '[{term: inputs}]' 
curlhttps://myapi.call |
jq-r'[.online_terms[].term]| sort[]|

通信-23-请检查。我们不需要看到curl调用的完整输出,但是一个代表性的示例,或者至少是来自
jq.all
的输出的示例,会很有帮助。同样是$list的一个例子。@peak是的,我真诚的道歉,意识到原来的帖子是不完整的,希望它现在足够了,谢谢,它是完整的,但是插图和要求之间似乎有一些不一致。另外,请修复第一个数组,使其成为有效的JSON。请查看。我们不需要看到curl调用的完整输出,但是一个代表性的示例,或者至少是来自
jq.all
的输出的示例,会很有帮助。同样是$list的一个例子。@peak是的,我真诚的道歉,意识到原来的帖子是不完整的,希望它现在足够了,谢谢,它是完整的,但是插图和要求之间似乎有一些不一致。另外,请修复第一个数组,使其成为有效的JSON。超级棒!感谢你给出了一个JQ力量的具体例子。从手册页上我们都知道它是完全有能力的,但是对于更复杂的事情,需要对JSON和数组有深入的理解。我使用了您建议的第一个版本,使用了
echo“$(tmux ls)”|
而不是文本文件,谢谢!第一次尝试超级棒!感谢你给出了一个JQ力量的具体例子。从手册页上我们都知道它是完全有能力的,但是对于更复杂的事情,需要对JSON和数组有深入的理解。我使用了您建议的第一个版本,使用了
echo“$(tmux ls)”|
而不是文本文件,谢谢!第一次尝试共享时,当需要对两个列表进行优先排序时,使用
comm
而不是
grep
diff
是否有任何价值?
comm
对于任务来说应该更有效,并且可能更易于正确或安全地使用。感谢共享,当需要对两个列表进行抢占排序时,使用
comm
而不是
grep
diff
有什么价值吗?
comm
应该对任务更有效,并且可能更容易正确或安全地使用。