目前,当我想使用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 输出,我需要在 Linux 中从中提取一些参数。
这是 JSON 输出:
{
"OwnerId": "121456789127",
"ReservationId": "r-48465168",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": null,
"RootDeviceType": "ebs",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2014-03-19T09:16:56.000Z",
"PrivateIpAddress": "10.250.171.248",
"ProductCodes": [
{
"ProductCodeId": "aacglxeowvn5hy8sznltowyqe",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-86bab0e4",
"StateTransitionReason": null,
"InstanceId": "i-1234576",
"ImageId": "ami-b7f6c5de",
"PrivateDnsName": "ip-10-120-134-248.ec2.internal",
"KeyName": "Test_Virginia",
"SecurityGroups": [
{
"GroupName": "Test",
"GroupId": "sg-12345b"
}
],
"ClientToken": "VYeFw1395220615808",
"SubnetId": "subnet-12345314",
"InstanceType": "t1.micro",
"NetworkInterfaces": [
{
"Status": …Run Code Online (Sandbox Code Playgroud) 我有以下 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 文件进行 grep。如何限制 grep 在匹配的左侧和右侧显示最多 N 个字符的上下文?除了 grep 之外的任何工具都可以,只要它在常见的 Linux 包中可用。
这将是示例输出,对于虚构的 grep 开关?:
$ grep -r foo *
hello.txt: Once upon a time a big foo came out of the woods.
$ grep -? 10 -r foo *
hello.txt: ime a big foo came of t
Run Code Online (Sandbox Code Playgroud) 我有一个位于一行的大型 JSON 文件,我想使用命令行来计算文件中某个单词出现的次数。我怎样才能做到这一点?
我熟悉解析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) 似乎有各种 JavaScript + 浏览器特定的解压缩方法,但是没有某种方法可以将 jsonlz4 文件转换为unlz4可以读取的内容吗?
我正在使用 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)
不产生任何东西。如何更改此设置以便为用户名变量分配输出?