我有一个来自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",
"...": "..."
}]
}
供您参考:这是我必须使用的测试脚本,因为其中有一些神奇之处我不想用其他脚本语言重写。
答案 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