目前,当我想使用jq漂亮地打印一个 json 文件时,我使用:
cat file.json | jq .
Run Code Online (Sandbox Code Playgroud)
但是我希望jq接受一个文件名作为参数而不必回退到cat.
手册页说:
jq [选项...] 过滤器 [文件...]
... 默认情况下,jq 从 stdin 读取 JSON 对象流(空格分隔)。可以指定一个或多个文件,在这种情况下 jq 将从这些文件中读取输入。
仍在运行:
jq file.json
Run Code Online (Sandbox Code Playgroud)
通过抛出未定义键的编译错误而失败。
运行时我应该如何添加文件jq?
我有以下 JSON 文件:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Run Code Online (Sandbox Code Playgroud)
我想要一个这种格式的 CSV 文件:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Run Code Online (Sandbox Code Playgroud)
这可以通过仅使用jq吗?我没有任何编程技能。
我熟悉解析json的“jq”。
我使用一种产生 json 响应的服务,其中一个属性本身就是一个 json 字符串。如何将该引用的值转换为有效的 json 字符串,以便我可以使用 jq 处理它?
例如,如果我只是从“jq.”查看简单的漂亮打印的 json,下面是输出的简短摘录:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Run Code Online (Sandbox Code Playgroud)
我可以使用 jq 来获取该属性的值,但我需要通过“转义”将引用的字符串转换为有效的 json。
我想我可以将它导入 sed,删除开始和结束双引号,并删除所有反斜杠 (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'")。这似乎有效,但这似乎不是最强大的解决方案。
更新:
为了更清楚地了解我在做什么,这里有几个省略的示例,显示了我的尝试:
% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...
Run Code Online (Sandbox Code Playgroud)
更新:
这是一个完全独立的示例:
% cat stuff.json | jq .
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}" …Run Code Online (Sandbox Code Playgroud) 输入json:
[
{
"id": "89",
"hostname": "abcd"
},
{
"id": "89",
"hostname": "babcd"
}
]
Run Code Online (Sandbox Code Playgroud)
如何修改下面的过滤器以仅输出以“abcd”开头的主机名?
$ jq -r '.[]|select(.hostname | contains("abcd"))' jjjj
{
"id": "89",
"hostname": "abcd"
}
{
"id": "89",
"hostname": "babcd"
}
$ jq -r '.[]|select(.hostname | contains("^abcd"))' jjjj
$
Run Code Online (Sandbox Code Playgroud) 我正在尝试curl一些返回 json 文件的 URL,然后我想从中解析主机并创建一个逗号分隔的字符串。
我有第一部分工作
curl -s -u "admin:admin" -H "X-Requested-By: ambari" "https://hbasecluster.net/api/v1/clusters/mycluster/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" | jq -r '.host_components[].HostRoles.host_name'
Run Code Online (Sandbox Code Playgroud)
返回
zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud)
现在我想将这些加入一个字符串中
zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud) 我正在使用 curl 从这样的休息 api 中获取 JSON:
content=$(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc)
echo "${content}"| jq -r '.data.value'
Run Code Online (Sandbox Code Playgroud)
这产生了我需要的价值。然而; 当我将上面的代码更改为如下所示时:
content=$(curl -s -X GET -H "Header:Value" http://127.0.0.1:8200/etc)
username=$(echo "${content}"| jq -r '.data.value')
echo $username
Run Code Online (Sandbox Code Playgroud)
不产生任何东西。如何更改此设置以便为用户名变量分配输出?
我有一个像这样的 JSON 数组:
{
"SITE_DATA": {
"URL": "example.com",
"AUTHOR": "John Doe",
"CREATED": "10/22/2017"
}
}
Run Code Online (Sandbox Code Playgroud)
我希望使用 jq 迭代这个数组,这样我就可以将每个项目的键设置为变量名,将值设置为它的值。
例子:
到目前为止,我对数组进行了迭代,但创建了一个字符串:
constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")
Run Code Online (Sandbox Code Playgroud)
哪些输出:
URL=example.com
AUTHOR=John Doe
CREATED=10/22/2017
Run Code Online (Sandbox Code Playgroud)
我希望在脚本中进一步使用这些变量:
echo ${URL}
Run Code Online (Sandbox Code Playgroud)
但这目前与空输出相呼应。我猜我需要一个eval或什么在那里,但似乎无法将我的手指放在上面。
jq当输出被重定向时需要一个显式过滤器的问题在整个网络上都有讨论。但是如果jq是管道链的一部分,我无法重定向输出,即使在使用显式过滤器时也是如此。
考虑:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,jq命令的原始终端中的输出是:
1
3
Run Code Online (Sandbox Code Playgroud)
但是,如果我在jq命令的末尾添加任何类型的重定向或管道,输出将变得无声:
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Run Code Online (Sandbox Code Playgroud)
第一个终端中没有输出,out.txt 为空。
我已经尝试了数百种变体,但这是一个难以捉摸的问题。唯一的解决办法我发现,通过发现mosquitto_sub和东西网(这是我在那里也发现了这个问题),是包尾,并在shell脚本JQ功能:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo …Run Code Online (Sandbox Code Playgroud) 输入json:
{
"id": "3885",
"login": "050111",
"lastLoginTime": 1529730115000,
"lastLoginFrom": "192.168.66.230"
}
{
"id": "3898",
"login": "050112",
"lastLoginTime": null,
"lastLoginFrom": null
}
Run Code Online (Sandbox Code Playgroud)
我想以制表符分隔的格式获取登录、lastLoginTime 和 lastLoginFrom 的输出:
050111 1529730115000 192.168.66.230
050112 - -
Run Code Online (Sandbox Code Playgroud)
使用下面的 jq 过滤器,我得到的输出没有“空”值,我可以用“-”替换
$ jq -r '.|[.login, .lastLoginTime, .lastLoginFrom]|@tsv' test_json
050111 1529730115000 192.168.66.230
050112
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以为这样的空值打印“-”?
我想使用 jq 将一个包含元素和值的数组添加到现有的 json 文件中。
我已经有一个文件(input.json)
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
Run Code Online (Sandbox Code Playgroud)
我想将它添加到另一个组数组中到这个 json (orig.json)
[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
Run Code Online (Sandbox Code Playgroud)
最终结果应该是这样的
[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
],
"displayName": …Run Code Online (Sandbox Code Playgroud)