我在bash变量中有一个json字符串,就像这样:
{
"items": [
{
"foo": null,
"timestamp": 1553703000,
"bar": 123
},
{
"foo": null,
"timestamp": 1553703200,
"bar": 456
},
{
"foo": null,
"timestamp": 1553703400,
"bar": 789
}
]
}
我想知道在给定日期时间之后有多少timestamp
个,所以如果我有1553703100
,它将返回2
。
(如果你能给我这个数字的话,加分虚构点!)
为此,我想只获取字符串中"timestamp": \d+,
的匹配项,以便可以在bash脚本中循环遍历它们。
我曾经使用过sed和grep,但是从未使用过awk,从我的阅读看来,这也许是与该任务更好的匹配。
其他信息: -JSON已经如上打印,因此时间戳始终位于单独的行上。 -这是要在Cygwin中运行,所以我有awk / gawk,sed和grep / egrep,但可能没有其他人。 -json中可以是任意数量的时间戳。
答案 0 :(得分:4)
您没有提供预期的输出,因此只是一个猜测,但这是您要执行的操作吗?
$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400
或者也许:
$ echo "$var" | jq '.items[].timestamp | select(. > 1553703100)'
1553703200
1553703400
或:
$ echo "$var" | jq '[.items[].timestamp | select(. > 1553703100)] | length'
2
警告:我只是在学习jq
,所以可能会有更好的方法来完成上述操作!
答案 1 :(得分:3)
edit:下面列出的第二种方法存在严重的问题,@ EdMorton对此很有帮助。我选择保留旧代码用于教育目的。
避免使用substr()
并捕获到空字符串i
:
$ awk -v dt=1553703100 '
/timestamp/ && $2+0>dt {i++}
END {print i+0}
' <<< "$var"
2
警告:问题代码
在这里,我使用substr(string, index, [characters])
来将逗号修剪掉第二个字段。 /timestamp/
正则表达式并不复杂;如果您的json变得更加复杂,则可以进行改进。
$ awk -v dt=1553703100 '
/timestamp/ && substr($2, 0, length($2)) > dt {i++}
END {print i}
' <<< "$var"
2
答案 2 :(得分:0)
您还可以快速实施python
解决方案:
输入:
$ cat data.json
{
"items": [
{
"foo": null,
"timestamp": 1553703000,
"bar": 123
},
{
"foo": null,
"timestamp": 1553703200,
"bar": 456
},
{
"foo": null,
"timestamp": 1553703400,
"bar": 789
}
]
}
代码:
$ cat extract_value2.py
import json
tLimit = 1553703100
with open('data.json') as f:
data = json.load(f)
print([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit])
输出:
$ python extract_value2.py
[1553703200, 1553703400]
计数代码:
$ cat extract_value2.py
import json
tLimit = 1553703100
with open('data.json') as f:
data = json.load(f)
print(len([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit]))
输出:
$ python extract_value2.py
2