正则表达式使用 bash 从 Json 文件中获取单个值

itg*_*eek 3 linux grep json aws

我想从下面的 JSON 文件内容中检索值“tenki-deploy-topic”。我使用了这个正则表达式grep -o 'topic[^"]*' output.log,然后它获取了所有主题的文件,相反,我想使用其他一些键,例如“tenki”或“dense”。

{ "Topics": [ { "Name": "arn:aws:sns:us-west-2:123456789012:topic-freezing-deploy" }, { "Name": "arn:aws:sns:us-west-2:123456789012:topic-dense-deploy" }, { "Name": "arn:aws:sns:us-west-2:123456789012:topic-tenki-deploy" } ] }
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 5

在尝试解析 JSON 时,使用 Linux/Unix 的典型 CLI 工具(例如awksed、 & )grep几乎总是错误的方法。

我在终端使用 JSON CLI 的典型 goto 工具是jq. 它在所有存储库中,并且可以轻松安装。

您如何只选择Topics数组中的元素的问题变得微不足道:

$ jq '.Topics[] | select(.Name | contains("topic-tenki-deploy"))' output.log 
{
  "Name": "arn:aws:sns:us-west-2:123456789012:topic-tenki-deploy"
}
Run Code Online (Sandbox Code Playgroud)

上面的方法是从.Topics[]数组中取出元素,然后选择.Name其值包含topic-tenki-deploy.

参考

  • +1 ... 或 `jq -r --arg str "tenki" '.Topics[] | select(.Name | contains($str)).Name | split(":")[-1]'` 如果要参数化搜索,并获取 Name 字符串最后一个组件的裸值 (3认同)