我正在尝试将时间统计信息从我们的一个脚本转换为JSON格式以进行进一步处理,但未能这样做。以下是统计信息输出的示例:
cmd ls -lah
0m1.964s
cmd echo something
0m4.183s
cmd setup-environment
0m0.401s
我想将以“cmd”开头的行作为键,将下一行的时间值作为“值”。
我可以将“cmd”作为键名,将实际命令作为cmd.value,但这不是我的目标:
cat statistics.txt | jq -R 'split("\n") - [""]' | jq '.[] | if select( contains("cmd")) then { "cmd": . } else { "time": . } end'
我也知道“如果”和“选择”对于jq来说意味着几乎相同,但我不知道我怎么能达到我想要的效果(“其他”甚至不能在我的产品中产生任何东西例)。这就是我目前所得到的:
{
"cmd": "cmd ls -lah"
}
{
"cmd": "cmd echo something"
}
{
"cmd": "cmd setup-environment"
}
有人可以帮我吗?
答案 0 :(得分:0)
jq
+ paste
解决方案:
jq -R 'split(",") | {(.[0]) : .[1]}' <(paste -d, - - <statistics.txt)
输出:
{
"cmd ls -lah": "0m1.964s"
}
{
"cmd echo something": "0m4.183s"
}
{
"cmd setup-environment": "0m0.401s"
}
答案 1 :(得分:0)
All-jq解决方案:
jq -Rn '{ (inputs): input }' statistics.txt
命令行选项包括:
inputs
过滤器看到第一行生成具有更多结构的JSON对象可能更有意义,例如形式为{"cmd": _, "value": _}
。假设“cmd”行始终如statistics.txt中那样开始,这也可以很容易地实现,例如,由:
jq -Rn '{ cmd: inputs[4:], value: input }' statistics.txt
inputs
jq -R -s 'split("\n")
| recurse( .[2:] | select(length>0))
| {(.[0]): .[1]}' statistics.txt
答案 2 :(得分:-1)
如何组合shell变量和command substitution?
您可以在bash脚本中执行以下操作:
cmd="cmd ls -lah"
cat << EOF
{
\"cmd\": \"$cmd\",
\"time\": \"$(time $cmd)\"
}
EOF
如果您不喜欢time
或其他命令的输出,可以将其括在shell函数中。
chrono() {
command=$1
result=$(/bin/time $command >/dev/null 2>&1)
# Awk or sed to give format to the output
}