【问题标题】:How to grep json values with out sorting如何在不排序的情况下grep json值
【发布时间】:2018-08-15 04:11:15
【问题描述】:

这是json的一部分。当名称为“US”时,我想获取“state”的值。但是,如果您看到 json,我们会发现很多名称都是“US”。但我需要在整个 json 中获得第一个出现的“US”。因此输出将是

输出: “FINISHED”(第一次出现“US”)

我用过 grep -A 5 "美国" |剪切 -d ':' -f2 |排序-u` 但结果并不好。

grep : 找出美国 -A 5:打印接下来的 5 行 -u:删除重复项

但我不确定如何在不排序的情况下删除重复项 有什么帮助吗?

{

    "starttime" : 1533557223447,
    "id" : "app-20180806120703-6027",
    "name" : "US",
    "cores" : 5,
    "user" : "spark",
    "memoryperslave" : 8192,
    "submitdate" : "Mon Aug 06 12:07:03 UTC 2018",
    "state" : "FINISHED",
    "duration" : 184631
  }, 
{

    "starttime" : 1533557411909,
    "id" : "app-20180806121011-6028",
    "name" : "US",
    "cores" : 5,
    "user" : "spark",
    "memoryperslave" : 8192,
    "submitdate" : "Mon Aug 06 12:10:11 UTC 2018",
    "state" : "FAILED",
    "duration" : 135928
  }, 
{

    "starttime" : 1533557551584,
    "id" : "app-20180806121231-6029",
    "name" : "US",
    "cores" : 5,
    "user" : "spark",
    "memoryperslave" : 8192,
    "submitdate" : "Mon Aug 06 12:12:31 UTC 2018",
    "state" : "KILLED",
    "duration" : 136974
  }, 
{

    "starttime" : 1533557692376,
    "id" : "app-20180806121452-6030",
    "name" : "CA - CONGO STREAM",
    "cores" : 5,
    "user" : "spark",
    "memoryperslave" : 8192,
    "submitdate" : "Mon Aug 06 12:14:52 UTC 2018",
    "state" : "FINISHED",
    "duration" : 187685
  }

【问题讨论】:

    标签: json shell unix grep


    【解决方案1】:

    使用jq,类似于 JSON 的 sed 和 grep。在你的例子中:

    $>jq '[.[]| select( .name == "US")][0] | .state' sample.json
    

    将您的 json 输入jq,我选择所有美国对象,将该选择包装在一个数组中并选择第一项,然后打印该第一项的状态。输出是:

    "FINISHED"
    

    有关详细信息,请参阅 Jq 文档 (https://stedolan.github.io/jq/)。

    如果你真的坚持使用 grep,那么这就足够了:

    grep -A 5 "US" | grep  "state.*:.*\"[A-Z]\+\"" | cut -d: -f2 | head -1
    

    【讨论】:

    • 令人困惑的是,grep -m1 -A5 "US" 在 MacOS High Sierra 上只能给我一行输出,而grep -m5 -A5 "US" 给我多个匹配项,并带有上下文。如果您的实际输出比问题中的样本大得多,也许后者仍然会有所帮助。
    • @tripleee MacOS 使用 BSD grep,而不是 gnu grep。在该版本中, -m 在最后一次匹配后立即停止读取文件。要解决此问题,请使用 -B 并搜索“状态”(即反向搜索);使用--上下文;或使用自制软件安装 gnu grep(它将安装为“ggrep”)。
    • 是的,我认为我有改进,但它在 *BSD 上不起作用。我想我还是会发表评论,以防其他人可能会浪费时间发现同样的事情。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多