小编Chr*_*ris的帖子

jq - 选择以字符串开头的属性

输入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)

json jq

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

JQ - 打印“ - ”为空值

输入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)

有没有其他方法可以为这样的空值打印“-”?

json jq

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

jq - 在一行中打印值

json输入:

[
  {
    "name": "cust1",
    "grp": [
      {
        "id": "46",
        "name": "BA2"
      },
      {
        "id": "36",
        "name": "GA1"
      },
      {
        "id": "47",
        "name": "NA1"
      },
      {
        "id": "37",
        "name": "TR3"
      },
      {
        "id": "38",
        "name": "TS1"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

预期,输出是两行:

name: cust1
groups: BA2 GA1 NA1 TR3 TS1
Run Code Online (Sandbox Code Playgroud)

我试图构建过滤器但没有成功..

$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1
Run Code Online (Sandbox Code Playgroud)

更新:下面提供的解决方案工作正常,但我没有预测不存在组的情况:

[
  {
    "name": "cust1",
    "grp": null
  }
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,提供的解决方案会返回错误:

$ jq -jr '.[]|"name:", …
Run Code Online (Sandbox Code Playgroud)

json jq

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

diff - 如何忽略空行

我需要区分两个文件,忽略所有空格和空/空白行,但由于某些原因,我发现 diff 选项做得并不好,它一直显示 file1 中的空行...

$ cat file1
2 nodes configured
13 resources configured

$ cat file2
2 nodes configured
23 resources configured
$ diff -ywBEZb -W 200 --suppress-blank-empty --suppress-common-lines file1 file2
13 resources configured                                                                            |    23 resources configured
                                                                                                   <
$ od -bc file1
0000000 062 040 156 157 144 145 163 040 143 157 156 146 151 147 165 162
          2       n   o   d   e   s       c   o   n   f   i   g   u   r
0000020 145 144 012 061 …
Run Code Online (Sandbox Code Playgroud)

linux diff

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

bash 脚本产生的输出与在 bash 提示符下运行命令时产生的输出不同

有一个脚本:

#!/bin/bash

s='1 2,   3   4,'
s0="$(echo ${s//,/ }|tr -s ' ')"
echo "s0: $s0"
d="'${s0//+([[:space:]])/"' '"}'"
echo "d: $d"
Run Code Online (Sandbox Code Playgroud)

当我运行此脚本时,输出是:

$ ./test.sh
s0: 1 2 3 4
d: '1 2 3 4'
Run Code Online (Sandbox Code Playgroud)

当我在 bash 提示符下一一运行命令时,变量$d正确显示:

$ s='1 2,   3   4,'
$ s0="$(echo ${s//,/ }|tr -s ' ')"
$ echo "s0: $s0"
s0: 1 2 3 4
$ d="'${s0//+([[:space:]])/"' '"}'"
$ echo "d: $d"
d: '1' '2' '3' '4'
$
Run Code Online (Sandbox Code Playgroud)

命令在 bash 中运行:

$ type bash
bash is …
Run Code Online (Sandbox Code Playgroud)

bash shell-script

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

awk:从字段中提取字符串

在输入字段中由管道符号分隔:

CCCC|Sess C1|s1 DA=yy07:@##;/u/t/we
DDDDD|Sess C2|s4 DB=yy8:@##;/u/ba
Run Code Online (Sandbox Code Playgroud)

我想获得最后一个字段更改的输出(仅提取第一个 = 和 : 在此字段中的内容

预期输出为:

CCCC|Sess C1|yy07
DDDDD|Sess C2|yy8
Run Code Online (Sandbox Code Playgroud)

awk shell-script gawk

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

通过将多个 json 文件合并为一个公共对象来将其合并为一个

我有很多这种格式的json文件:

样品file1

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

样品file2

{
  "attributes": [
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

等等。

我需要将它们全部合并到一个 json 文件中,例如。

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    },
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

有人可以提供jq的解决方案吗?

json jq

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

bash - 对变量中的数字求和

我有一个变量集,其中的数字用空格分隔,其中第一个数字也可以由空格引导,例如:

VAR=" 2 1  34 3    2 "
Run Code Online (Sandbox Code Playgroud)

我需要将所有这些数字相加。最简单的方法是将数字之间的所有空格替换为+bc 上的管道

我可以用 for 循环、粘贴和 bc 来完成,但也许有人知道更简单的方法?也许直接在 bash 中VAR使用 bash 内置字符串替换进行一些计算?

$ for i in $VAR;do echo $i;done|paste -sd+|bc
42
Run Code Online (Sandbox Code Playgroud)

更新:感谢所有建议,我终于找到了带有数组的相当短的方法:

$ VAR=" 2 1  34 3    2 "
$ arr=( $VAR );echo "$((${arr[@]/%/+}0))"
42
$ VAR="$VAR -14"
$ arr=( $VAR );echo "$((${arr[@]/%/+}0))"
28
$
Run Code Online (Sandbox Code Playgroud)

bash arithmetic bc variable

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

uuid 上的“排序 -nu”

任何人都可以解释为什么“sort -nu”在下面的示例中仅返回 1 个唯一行?

$ cat /tmp/test_
1e971713-31e4-62d0-a3d1-37c0610c10e5
1e97d59f-bc32-6126-b7b1-0b52ddd35273
1e971713-31e4-62d0-a3d1-37c0610c10e5
$ sort -nu /tmp/test_
1e971713-31e4-62d0-a3d1-37c0610c10e5
$
Run Code Online (Sandbox Code Playgroud)

输出上不应该像“sort -u”那样有两条独特的行吗?

$ sort -u /tmp/test_
1e971713-31e4-62d0-a3d1-37c0610c10e5
1e97d59f-bc32-6126-b7b1-0b52ddd35273
$
Run Code Online (Sandbox Code Playgroud)

sort uuid

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

bash变量使用字符串操作用[]中的字母替换第一个字母

假设我有:

variable=string
Run Code Online (Sandbox Code Playgroud)

现在想用括号替换第一个字母

${variable/firstletter/[firstletter]}
Run Code Online (Sandbox Code Playgroud)

最后,我想在脚本中使用它来修改正则表达式模式,使其与自身不匹配:

ps -e -o time,user,pid,ppid,comm,args | grep ${variable/firstletter/[firstletter]}
Run Code Online (Sandbox Code Playgroud)

我想用它代替额外的管道和grep -v greppgrep

另外,也许您知道如何使用 awk 实现这样的过程 grep 而不是打印 awk 命令本身?

bash awk

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

标签 统计

jq ×4

json ×4

bash ×3

awk ×2

shell-script ×2

arithmetic ×1

bc ×1

diff ×1

gawk ×1

linux ×1

sort ×1

uuid ×1

variable ×1