输入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:
{
"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输入:
[
{
"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) 我需要区分两个文件,忽略所有空格和空/空白行,但由于某些原因,我发现 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) 有一个脚本:
#!/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) 在输入字段中由管道符号分隔:
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) 我有很多这种格式的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的解决方案吗?
我有一个变量集,其中的数字用空格分隔,其中第一个数字也可以由空格引导,例如:
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) 任何人都可以解释为什么“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) 假设我有:
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 grep
或pgrep
另外,也许您知道如何使用 awk 实现这样的过程 grep 而不是打印 awk 命令本身?