如何使用jq将json中的键值输出到表中?

时间:2020-11-04 19:37:28

标签: shell jq

我有这个从API获取的json。

{
"result": {
    "key1": "val1",
    "key2": "val2",
    "key3": "val3"
 }
}

我有以下shell脚本,该脚本在文本文件中为表创建标题。我想从上面的result对象中提取键值,并将其放在表中KEYS下和键VALUES下的相同文本文件中。我是jq和shell的新手,正在努力实现这一目标。

echo "%table"
echo -e "KEYS\tVALUES" > outputfile.txt
KEYVALS=$(curl -uuser:password 
"http://localhost:8080/customapi")
# here I want to split the key values using jq and write to the outputfile.txt 
cat outputfile.txt

我期望的结果是:

KEYS      VALUES
key1      val1
key2      val2
key3      val3

我该如何实现?

2 个答案:

答案 0 :(得分:2)

关键是使用.resultto_entries转换为键/值对数组,然后以原始模式输出一组字符串(使用字符串插值创建)。

% cat tmp.json
{
"result": {
    "key1": "val1",
    "key2": "val2",
    "key3": "val3"
 }
}
% jq -r '{"KEYS": "VALUES"} + .result | to_entries[] | "\(.key)\t\(.value)"' tmp.json
KEYS    VALUES
key1    val1
key2    val2
key3    val3

我在转换为键/值列表之前将标头添加到了输入中。

答案 1 :(得分:0)

通过在末尾添加列调用,对齐也适用于更长的值...... 请注意使用 @ 字符作为标记分隔符...当然,如果您的数据包含它,这将不起作用...

 aws cognito-idp list-user-pools --max-results 20 | \
 jq -r '.UserPools[]|to_entries[]|select (.key == "Name")|("\(.key):@\(.value)")'| column -t -s'@'

输出

 Name:  corp_stg_user_pool
 Name:  corp_dev_user_pool