我想知道给定的过滤器是否成功从JSON数据结构中提取数据.例如:
###### For the user steve...
% Name=steve
% jq -j --arg Name "$Name" '.[]|select(.user == $Name)|.value' <<<'
[
{"user":"steve", "value":false},
{"user":"tom", "value":true},
{"user":"pat", "value":null},
{"user":"jane", "value":""}
]'
false
% echo $?
0
Run Code Online (Sandbox Code Playgroud)
注意:成功的结果可以包括布尔值,null甚至是空字符串.
###### Now for user not in the JSON data...
% Name=mary
% jq -j --arg Name "$Name" '.[]|select(.user == $Name)|.value' <<<'
[
{"user":"steve", "value":false},
{"user":"tom", "value":true},
{"user":"pat", "value":null},
{"user":"jane", "value":""}
]'
% echo $?
0
Run Code Online (Sandbox Code Playgroud)
如果过滤器不从JSON数据结构中提取数据,我需要知道这一点.我希望过滤器返回非零返回码.
我如何确定选择器是否成功从JSON数据结构中提取数据而无法提取数据?
重要提示:上面的过滤器只是一个示例,解决方案需要适用于任何jq过滤器.
注意:评估环境是Bash 4.2+.
我正在寻找将JSON jq转换为分隔符分隔和扁平化结构.
已有尝试过.例如,使用jq Flatten嵌套JSON.
但是,如果JSON包含数组,则该页面上的解决方案将失败.例如,如果JSON是:
{"a":{"b":[1]},"x":[{"y":2},{"z":3}]}
Run Code Online (Sandbox Code Playgroud)
上面的解决方案将无法将上述内容转换为:
{"a.b.0":1,"x.0.y":2,"x.1.z":3}
Run Code Online (Sandbox Code Playgroud)
另外,我正在寻找一种也允许任意分隔符的解决方案.例如,假设空格字符是分隔符.在这种情况下,结果将是:
{"a b 0":1,"x 0 y":2,"x 1 z":3}
Run Code Online (Sandbox Code Playgroud)
我希望通过CentOS 7中的Bash(4.2+)函数访问此功能,如下所示:
flatten_json()
{
local JSONData="$1"
# jq command to flatten $JSONData, putting the result to stdout
jq ... <<<"$JSONData"
}
Run Code Online (Sandbox Code Playgroud)
该解决方案应该适用于所有JSON数据类型,包括null和boolean.例如,请考虑以下输入:
{"a":{"b":["p q r"]},"w":[{"x":null},{"y":false},{"z":3}]}
Run Code Online (Sandbox Code Playgroud)
它应该产生:
{"a b 0":"p q r","w 0 x":null,"w 1 y":false,"w 2 z":3}
Run Code Online (Sandbox Code Playgroud) 我有一个非常大的文件(> 500GB),我希望用一个相对较小的标题(<20KB).执行以下命令:
cat header bigfile > tmp
mv tmp bigfile
Run Code Online (Sandbox Code Playgroud)
或类似命令(例如,使用sed)非常慢.
将标头写入现有大文件开头的最快方法是什么?我正在寻找可以在CentOS 7.2下运行的解决方案.可以从CentOS安装或更新repo,EPEL或RPMForge安装软件包.
如果存在一些不涉及重定位或复制bigfile中的大量数据的方法,那将是很好的.也就是说,我希望能够在给定头文件的固定时间内运行的解决方案,无论bigfile的大小如何.如果要求太多,那么我只是要求最快的方法.
编译辅助工具(如在C/C++中)或使用脚本语言是完全可以接受的.
对于 Bash 程序:
1 #!/bin/bash
2
3 trapinfo()
4 {
5 echo "=== Trap Info: Status=$? LINENO=$@ A=$A"
6 }
7
8 main()
9 {
10 trap 'trapinfo $LINENO -- ${BASH_LINENO[*]}' ERR
11
12 set -e
13 set -E
14 set -o errtrace
15 shopt -s extdebug
16
17 local -g A=1
18
19 # false # If uncommented, LINENO would be 19
20 (exit 73) # LINENO is 9. How can I get 20 instead?
21
22 A=2
23 …Run Code Online (Sandbox Code Playgroud) 问题
declare -p获取有效Bash关联数组的结果,其中键包含方括号会导致错误的数组下标错误.
测试程序
做:
$ declare -A array
$ key='var[0]'
$ array["$key"]=37
$ echo ${array["$key"]}
37
$ declare -p array > def.sh
$ cat def.sh
declare -A array='(["var[0]"]="37" )'
$ . def.sh
bash: [var[0]]=37: bad array subscript
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,请注意:
var[0]declare -p我能够将此定义保存到文件:def.shdef.sh会发出错误.我的环境
解决方法
如果不是declare -p array > def.sh我这样做:
{
echo 'declare -A array'
for Key in "${!array[@]}"; …Run Code Online (Sandbox Code Playgroud) 我有以下代码,使用python和lxml来漂亮地打印文件example.xml:
python -c '
from lxml import etree;
from sys import stdout, stdin;
parser=etree.XMLParser(remove_blank_text=True, strip_cdata=False);
tree=etree.parse(stdin, parser)
tree.write(stdout, pretty_print = True)' < example.xml
Run Code Online (Sandbox Code Playgroud)
我使用 lxml 是因为保留原始文件的保真度(包括保留 CDATA 习惯用法)非常重要。这是我正在使用的文件example.xml :
<projects><project name="helloworld" threads="1" pubsub="auto" heartbeat-interval="1">
<description><![CDATA[This is a sample project]]></description> <metadata> <meta id="studioUploadedBy">anonymous</meta>
<meta id="studioUploaded">1550863090439</meta> <meta id="studioModifiedBy">anonymous</meta>
<meta id="studioModified">1550863175384</meta> <meta id="studioTags">helloworld</meta>
<meta id="studioVersionNotes">This is just a sample project</meta> <meta id="layout">{"cq1":{"Source1":{"x":50,"y":-290}}}</meta>
</metadata> <contqueries> <contquery name="cq1"> <windows> <window-source pubsub="true" name="Source1">
<schema> <fields> <field name="name" type="string" key="true"/> …Run Code Online (Sandbox Code Playgroud) 我有一个jq问题。给定文件file.json包含:
[
{
"type": "A",
"name": "name 1",
"url": "http://domain.com/path/to/filenameA.zip"
},
{
"type": "B",
"name": "name 2",
"url": "http://domain.com/otherpath/to/filenameB.zip"
},
{
"type": "C",
"name": "name 3",
"url": "http://otherdomain.com/otherpath/to/filenameB.zip"
}
]
Run Code Online (Sandbox Code Playgroud)
我正在寻找使用jq创建另一个文件,仅当 url 的值与某个模式匹配时才修改 url。例如,我想更新任何与模式匹配的网址:
http://otherdomain.com.*filenameB.*
Run Code Online (Sandbox Code Playgroud)
到一些固定的字符串,例如:
http://yetanotherdomain.com/new/path/to/filenameC.tar.gz
Run Code Online (Sandbox Code Playgroud)
生成的json:
[
{
"type": "A",
"name": "name 1",
"url": "http://domain.com/path/to/filenameA.zip"
},
{
"type": "B",
"name": "name 2",
"url": "http://domain.com/otherpath/to/filenameB.zip"
},
{
"type": "C",
"name": "name 3",
"url": "http://yetanotherdomain.com/new/path/to/filenameB.tar.gz"
}
]
Run Code Online (Sandbox Code Playgroud)
我什至无法找到网址,更不用说更新它了。这是我得到的(错误的结果,并不能帮助我解决更新问题):
% cat file.json | jq -r …Run Code Online (Sandbox Code Playgroud) 我希望从以下位置删除所有线描字符:
PGPASSWORD="..." psql -d postgres -h "1.2.3.4" -p 9432 -c 'show pool_nodes' -U owner
node_id | hostname | port | status | lb_weight | role
---------+---------------+------+--------+-----------+---------
0 | 10.20.30.40 | 5432 | 2 | 0.500000 | primary
1 | 10.20.30.41 | 5432 | 2 | 0.500000 | standby
(2 rows)
Run Code Online (Sandbox Code Playgroud)
添加该-t选项可以去掉页眉和页脚,但竖线仍然存在:
PGPASSWORD="..." psql -t -d postgres -h "1.2.3.4" -p 9432 -c 'show pool_nodes' -U owner
0 | 10.20.30.40 | 5432 | 2 | 0.500000 | primary
1 | …Run Code Online (Sandbox Code Playgroud) 可以使用该命令cf target发现当前组织和空间。
% cf target
API endpoint: https://api.run.domain.com (API version 2.48.0)
User: admin
Org: myorg
Space: myspace
Run Code Online (Sandbox Code Playgroud)
我想使用REST API(cf curl /v2/...)来获取当前的组织和空间。我不想解析命令的结果cf target。
我通常用Bash编写脚本,这些脚本通过执行以下操作来定义变量(例如,获取CF API版本):
Result=$(cf curl /v2/info | jq -r '.api_version')
Run Code Online (Sandbox Code Playgroud)
因此,问题是:cf curl假设我已经通过身份验证(执行cf login),如何通过org和空间?
如果我有一个 JSON 输入数据:
输入.json
{
"metadata": {
"guid": "07f90eed-105d-41b2-bc20-4c20dfb51653"
},
"entity": {
"name": "first"
}
}
{
"metadata": {
"guid": "da187e3a-8db9-49fd-8c05-41f29cf87f51"
},
"entity": {
"name": "second"
}
}
{
"metadata": {
"guid": "6685c3af-5427-4add-8764-7b18ae3c23bb"
},
"entity": {
"name": "third"
}
}
Run Code Online (Sandbox Code Playgroud)
我想从中创建以下内容:
{
"first": "07f90eed-105d-41b2-bc20-4c20dfb51653",
"second": "da187e3a-8db9-49fd-8c05-41f29cf87f51",
"third": "6685c3af-5427-4add-8764-7b18ae3c23bb"
}
Run Code Online (Sandbox Code Playgroud)
也就是说,输入数据是一组单独的 JSON 对象,每个对象都具有所示的结构。我希望输出是单个 JSON 对象,其中键是.entity.name,值是.metadata.guid。
我试过了:
jq -r '{.entity.name: .metadata.guid}' input.json
jq -r 'map({(.entity.name): .metadata.guid})' input.json
Run Code Online (Sandbox Code Playgroud)
但这些只会产生语法错误。我得到的最接近的是:
jq -r '.entity.name as $name|.metadata.guid as $guid | { ($name) …Run Code Online (Sandbox Code Playgroud)