Linux bash解析json:获得第一个&最后的约会

时间:2015-09-15 12:23:44

标签: json regex linux bash

我有一个来自curl的JSON变量,如下所示(@ stackoverflow =漂亮打印),我想得到两条信息。日期是第一个日历日期和最后一个日历日期(ISO 8601),但我不知道如何在bash中执行此操作。最重要的是,我必须计算这两个日期之间的持续时间(可能只有几毫秒或更多)。

任何人都知道如何解决我的问题?

{
    "results": [{
        "...": "...",
        "date": "2012-09-15T14:04:00.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "2015-09-15T14:04:00.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "2015-09-11T14:04:00.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "2015-09-15T14:04:00.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "2015-09-15T14:04:30.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "2019-09-15T14:04:00.741+0200",
        "...": "..."
    },
    {
        "...": "...",
        "date": "1015-09-15T14:04:00.741+0200",
        "...": "..."
    }]
}

供您参考:这是我必须使用的测试脚本,因为其中有一些神奇之处我不想用其他脚本语言重写。

3 个答案:

答案 0 :(得分:2)

使用jq解析JSON并提取所有日期,然后对它们进行排序并输出第一个和最后一个日期。

curl ... | jq '.results[] | .date' | sort | awk 'NR==1; END {print}'

答案 1 :(得分:1)

目前尚不清楚设置的确切含义,但如果您在变量名称JSON中有文本,则可以使用以下内容提取包含所需日期的行:

echo "$JSON" | awk '/date/ && !a++; /date/ {l=$0} END {print l}'

(取决于已删除的内容;您可能会遇到一些错误的命中,需要更严格的正则表达式)。但是使用shell工具解析json确实是一个坏主意。

答案 2 :(得分:0)

这对我有用:

   echo $JSON | tr '"' '\n' | sed -n '/date/{n;n;p}'
   dates=$(echo $JSON | tr '"' '\n' | sed -n '/date/{n;n;p}')
   for date in ${dates[@]}
      do
      echo $date
   done