小编Ale*_*lex的帖子

jq to_entries 字符串和数字不能相加

我不明白to_entriesjq 是如何工作的。

我有以下 json 有效负载payload.json

{"REGION":"us-east-1","EMAIL":"contain","UPDATE":1}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为=分隔密钥对,如下所示;

REGION=us-east-1
EMAIL=contain
UPDATE=1
Run Code Online (Sandbox Code Playgroud)

我正在使用

jq -r 'to_entries | .[] | .key + "=" + .value' < payload.json
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误

jq: error (at <stdin>:0): string ("UPDATE=") and number (1) cannot be added
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,问题在于更新值是一个数字,而不是一个字符串(即,它们的类型不匹配是一个问题),所以我尝试了以下操作,都出现了相同的错误;

string interpolation:
jq -r 'to_entries | .[] | (.key) + "=" + (.value)' < payload.json

tostring:
jq -r 'to_entries | .[] | .key + "=" + .value|tostring' < payload.json
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

json jq

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

jq:选择范围

TL; DR:给定一个带有一系列密钥对的输入文件,我想选择倒数第三对和倒数第四对。我可以单独购买它们,但如果可能的话,我想同时抓住它们。能做到吗?

我的输入文件的结构如下:

[
 {
  "foo": "bar",
  "foo2": "bar2"
 },
 {
  "foo3": "bar3",
  "foo4": "bar4"
 },
 {
  "foo5": "bar5",
  "foo6": "bar6"
 },
 {
  "foo7": "bar7",
  "foo8": "bar8"
 },
 {
  "foo9": "bar9",
  "foo10": "bar10"
 }
]
Run Code Online (Sandbox Code Playgroud)

我的输出应该是

[ 
 {
  "foo3": "bar3",
  "foo4": "bar4"
 },
 {
  "foo5": "bar5",
  "foo6": "bar6"
 }
]
Run Code Online (Sandbox Code Playgroud)

我知道我可以jq -s '.[-3]'拿到倒数第3名(并用4倒数第4名换掉),但这会分别抓住他们。

我从文档中认为jq -s '.[-3;-4]'可以同时抓住两者,但是会引发错误。

我可以单独抓取它们,然后分别进行处理,但这是草率的代码。有没有一种更干净的方式可以同时抓取两者?

arrays json slice jq

3
推荐指数
2
解决办法
2286
查看次数

如果没有结果,如何停止grep创建空文件

我正在比较两个文件的结果,其中一个是不在另一个文件中使用的 grep -v -f file1.txt file2.txt > result.txt

假设我的文件看起来像;

FILE1.TXT

alex
peter
zoey
Run Code Online (Sandbox Code Playgroud)

FILE2.TXT

alex
john
peter
zoey
Run Code Online (Sandbox Code Playgroud)

所以result.txt应该包含john

这是在Jenkins工作中运行的,result.txt如果两者之间没有差异,jenkins最终不满意创建一个空.

我不能只做一个盲目差异/无差异输出,我特别需要知道哪些线路有所不同.

如果没有结果,是否有更简洁的方法来运行此命令以不创建文件?

bash grep

3
推荐指数
2
解决办法
869
查看次数

防止 pwgen -y 生成反引号或引号?(或以其他方式清理输出)

我在 bash 脚本中使用 pwgen。为了安全起见,我们必须使用该-y标志来包含至少一个特殊字符。然而,这经常返回带有一个或多个 ` 或 " 的密码,这会破坏周围的脚本。

我可以阻止生成这些字符吗?如果没有,删除、替换或以其他方式清理 pwgen 的输出以排除这些字符的最干净方法是什么?

我当前的 pwgen 是;

intPW=$(pwgen -c -n -y -B -1 15)
Run Code Online (Sandbox Code Playgroud)

这意味着 intPW 的值可能是这样的;

iqui`c:ee4so4Ch
hph7eew"ohr9Ee
Run Code Online (Sandbox Code Playgroud)

我需要保证每个密码中都有一个符号,而不是有问题的符号之一。

我能想到的任何替换(从 if 循环到 sed)都会中断,因为我试图针对反引号。

passwords bash

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

sort -o将换行符附加到文件末尾 - 为什么?

我正在处理一个小文本文件,其中包含一个单词列表,我想添加一个新单词,然后排序.我启动时文件末尾没有换行符,但排序后却没有换行符.为什么?我可以避免这种行为,还是有办法将换行删除?

例:

words.txt 好像

apple
cookie
salmon
Run Code Online (Sandbox Code Playgroud)

然后我跑了 printf "\norange" >> words.txt; sort words.txt -o words.txt

我使用printf而不是echo来确定是否会避免换行,但文件会读取

apple
cookie
orange
salmon
#newline here
Run Code Online (Sandbox Code Playgroud)

如果我只是运行printf "\norange" >> words.txt橙色出现在文件的底部,没有换行符,即;

apple
cookie
salmon
orange
Run Code Online (Sandbox Code Playgroud)

sorting bash

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

当键是已知字符串时,用jq删除键/值对

我正在尝试从json文件中删除一个特定的键/值对。

在本例中,我的json文件是 params.json

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMSnapshotID",
    "ParameterValue": "snapID"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

我想在RTSMSnapshotID我的bash脚本中完全删除键值对。该文件应如下所示:

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

我以为这很简单

jq 'del(.RTSMSnapshotID)' params.json  
Run Code Online (Sandbox Code Playgroud)

但我越来越

jq: error (at <filename>): Cannot index array with string "RTSMSnapshotID"
Run Code Online (Sandbox Code Playgroud)

显然,我不明白删除的工作原理。有什么帮助吗?

bash jq

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

jq - 迭代字典

我的 json 知识很不稳定,所以如果我使用了错误的术语,请原谅我。

我有input.txt可以简化为:

[
  {
    "foo1": "bar1",
    "baz1": "fizz1"
  },
  {
    "foo2": "bar2",
    "baz2": "fizz2"
  }
]
Run Code Online (Sandbox Code Playgroud)

我想通过循环迭代每个对象,所以我本质上希望首先处理 1,然后循环处理 2,等等。

我以为是这样的:

jq 'keys[]' input.json | while read key ; do
    echo "loop --$(jq "[$key]" input.json)"
done
Run Code Online (Sandbox Code Playgroud)

但这给了我

loop 0
loop 1
Run Code Online (Sandbox Code Playgroud)

我希望看到的地方(这里的间距是可选的,不确定 jq 将如何解析它):

loop { "foo1": "bar1", "baz1": "fizz1" }
loop { "foo2": "bar2", "baz2": "fizz2" }
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

iteration bash json jq

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

在 docker 容器中运行 pg_dump 并将文件输出到主机

我们通常必须从多个不同版本的数据库中 pg_dump。我想在具有正确 Postgres 版本的 Docker 容器内运行命令,并将转储输出输出到我的文件而不是容器。

我以为我会像这样实现它;

docker run -it postgres:9.6.6-alpine pg_dump --file backupFile.bak --dbname=CONNECTIONSTRING --verbose --format=c --blobs > backupFile.bak
Run Code Online (Sandbox Code Playgroud)

然而,这只是将 pg_dump 命令的终端输出输出到文件,而不是实际的转储。我最终得到一个本地文件,它只是命令的详细日志。

我错过了什么?

postgresql pg-dump docker

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

标签 统计

bash ×5

jq ×4

json ×3

arrays ×1

docker ×1

grep ×1

iteration ×1

passwords ×1

pg-dump ×1

postgresql ×1

slice ×1

sorting ×1