小编Ste*_*ige的帖子

如何判断jq过滤器是否成功从JSON数据结构中提取数据?

我想知道给定的过滤器是否成功从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+.

bash json return-code jq

10
推荐指数
2
解决办法
6041
查看次数

使用jq,Flatten Arbitrary JSON to Delimiter-Separated Flat Dictionary

我正在寻找将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数据类型,包括nullboolean.例如,请考虑以下输入:

{"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)

bash json jq

7
推荐指数
1
解决办法
2192
查看次数

在固定时间或非常快的前置到非常大的文件

我有一个非常大的文件(> 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++中)或使用脚本语言是完全可以接受的.

linux centos7

6
推荐指数
2
解决办法
904
查看次数

Bash Trap:如何获取非零状态子进程的行号

对于 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)

linux bash shell centos7 bash-trap

5
推荐指数
1
解决办法
413
查看次数

Bash:如何使用包含方括号或其他特殊字符的键来持久化和恢复关联数组

问题

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]
  • 该密钥引用了setter和getter
  • 我可以使用此密钥进行分配
  • 我可以使用此键从关联数组中获取值
  • 使用declare -p我能够将此定义保存到文件:def.sh
  • 在获取文件时def.sh会发出错误.

我的环境

  • 我正在使用的Bash版本是4.2.46(1)-release(x86_64-redhat-linux-gnu).
  • 我在CentOS 7.3.1611(核心)服务器上

解决方法

如果不是declare -p array > def.sh我这样做:

{
echo 'declare -A array'
for Key in "${!array[@]}"; …
Run Code Online (Sandbox Code Playgroud)

bash associative-array special-characters declare

5
推荐指数
1
解决办法
516
查看次数

如何使用 lxml 和 python 漂亮地打印 xml 文件的子树?

我有以下代码,使用pythonlxml来漂亮地打印文件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)

python lxml

5
推荐指数
1
解决办法
2455
查看次数

jq:如何根据子字符串匹配更新值?

我有一个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)

regex url json string-matching jq

4
推荐指数
1
解决办法
1693
查看次数

psql 非选择:如何删除格式并仅显示某些列?

我希望从以下位置删除所有线描字符:

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)

postgresql pgpool psql

4
推荐指数
1
解决办法
3470
查看次数

哪些cf curl命令可以显示当前组织和空间?

可以使用该命令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和空间?

cloud-foundry

3
推荐指数
1
解决办法
2886
查看次数

jq:如何将不相交的对象值组合为键/值对的单个对象?

如果我有一个 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)

json jq

2
推荐指数
1
解决办法
766
查看次数