输出到JSON格式的行,否则不起作用

时间:2018-03-21 09:17:37

标签: json jq

我正在尝试将时间统计信息从我们的一个脚本转换为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"
}

有人可以帮我吗?

3 个答案:

答案 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

命令行选项包括:

  • -R for raw input
  • -n以便inputs过滤器看到第一行

{“cmd”:_,“value”:_}

生成具有更多结构的JSON对象可能更有意义,例如形式为{"cmd": _, "value": _}。假设“cmd”行始终如statistics.txt中那样开始,这也可以很容易地实现,例如,由:

jq -Rn '{ cmd: inputs[4:], value: input }' statistics.txt

如果您的jq没有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 
}