jq命令使用

命令使用案例

  • 基本使用
1
2
cat abc.json|jq .
# 不要少了最后的点,这是用cat打开一个json文件,再传给jq命令,输出一个更好的格式
  • 获取某个key的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat abc.json|jq '.children'
# 取出json文件中的children字段下的内容

cat abc.json|jq '.children|.[].metadata_public|.channelID'
# 可以使用管道符取出多个字段,但要注意字段在json文件中是否是在[]中的,如果是,要加上.[]

cat abc.json|jq '.children|.[].metadata_public|.channelID + "," + .channelName'
# 还可以使用加号拼接字段,并且如果再次取相同位置的字段,可以直接写字段的名称

cat abc.json|jq '.children|.[].metadata_public|.channelID + "," + .[].channelName'
# 不要这样使用,因为再次取值时,使用了.[],这会造成第一个字段与第二个字段的笛卡尔乘积

cat abc.json|jq '.children|.[].metadata_public|.channelID + "," + .channelName?'
# ? 规则适合所有正确的 filter,在 filter 最后加上 ? 可以忽略错误信息
  • keys
1
2
cat abc.json|jq keys
# 取出所有key组成数组
  • .[]
1
2
cat abc.json|jq .[]
# 所有的 value
  • [.[]]
1
2
cat abc.json|jq [.[]]
# 所有的 value 组成的数组
  • 索引
1
2
3
4
5
cat abc.json|jq .[1]
# 取第2个字段的值

cat abc.json|jq .[0:2]
# 取第1和2个字段的值
  • 比如取出数组元素中 name 的值
1
2
3
4
echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq .[].name
"foo"
"bar"
"foobar"
  • 也可以用下面会提到的管道操作
1
2
3
4
echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq '.[]|.name'
"foo"
"bar"
"foobar"
  • 结果重新组成数组
1
2
3
4
5
6
echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq [.[].name]
[
"foo",
"bar",
"foobar"
]
  • 使用 map创建数组
1
2
3
4
5
6
echo '[{"name": "foo"},{"name": "bar"},{"name": "foobar"}]' |jq 'map(.name)'
[
"foo",
"bar",
"foobar"
]
  • length 可以获取字符串或数组的长度
1
2
3
4
echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '.url|length'
13
echo '["mozillazg.com", "mozillazg"]' |jq '.|length'
2
  • map(foo) 可以实现对数组的每一项进行操作,然后合并结果的功能
1
2
3
4
5
echo '["mozillazg.com", "mozillazg"]' | jq 'map(length)'
[
13,
9
]
  • select(foo) 可以实现对输入项进行判断,只返回符合条件的项
1
2
3
4
echo '["mozillazg.com", "mozillazg"]' | jq 'map(select(.|length > 9))'
[
"mozillazg.com"
]
  • 可以使用 \(foo) 实现字符串插值功能
1
2
3
echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '"hi \(.name)"'
"hi mozillazg"
# 注意要用双引号包围起来,表示是一个字符串
  • 使用 + 实现字符串拼接
1
2
echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '"hi " + .name'
"hi mozillazg"
  • 可以使用 if .. then .. elif .. then .. else .. end 实现条件判断
1
2
3
4
5
6
7
8
echo '[0, 1, 2, 3]' \
| jq 'map(if . == 0 then "zero" elif . == 1 then "one" elif . == 2 then "two" else "many" end)'
[
"zero",
"one",
"two",
"many"
]
  • 可以通过 {}[] 构造新的 object 或 数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo '["mozillazg.com", "mozillazg"]' |jq '{name: .[1]}'
{
"name": "mozillazg"
}

echo '{"url": "mozillazg.com", "name": "mozillazg"}' |jq '[.name, .url]'
[
"mozillazg",
"mozillazg.com"
]

echo '{"name": "mozillazg", "ages": [1, 2]}' | jq '{name, age: .ages[]}'
{
"name": "mozillazg",
"age": 1
}
{
"name": "mozillazg",
"age": 2
}
  • join
1
2
echo '["mozillazg.com", "mozillazg"]' | jq '.|join(" | ")'
"mozillazg.com | mozillazg"
  • 字符串split
1
2
3
4
5
echo '"mozillazg.com | mozillazg"' |jq 'split(" | ")'
[
"mozillazg.com",
"mozillazg"
]

利用ssh密钥对的私钥访问服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!--more-->
------------
Server
------------
1. 创建密钥对
ssh-keygen -t rsa -P ''
2. 将私钥改为.pem格式
openssl rsa -in .ssh/id_rsa -outform pem > dsjali.pem
3. 修改权限,不然连接时会报错
chmod 400 dsjali.pem
4. 从私钥中产生公钥
ssh-keygen -y -f dsjali.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+5xBrPVEJ3mRo/yVFtSQSv1/J09oYHkbTD+l/4or04YqUCHJ7iR+A/LMeff0c9xKCbT9h
sb/MvJGmCZGxuE375Fwu8XZGS8SfjYSxeh0uASOcZazOiBu4Ooegj9A3Ov4C9odPqISWbTdUx286WJqdzW7RZ0ZwkFOipr
oFrszAPnvg5xmlnMSa0afYgWhRXimmn2oyLt7PFfZIXX8PJnMs7x9B0+lwLLIVJRKrpU8if+gD80viC9wUJu3/jC1VF8Jg4Bq2aS7KiMX++L
Y1SKoOUUc0sHa/SFZEzuouaRGgrmU9XkM3DvzlfcrGN+/14WczAZG4st
5. 将上面的公钥写入认证文件
vim .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+5xBrPVEJ3mRo/yVFtSQSv1/J09oYHkbTD+l/4or04YqUCHJ7iR+A/LMeff0c9xKCbT9h
sb/MvJGmCZGxuE375Fwu8XZGS8SfjYSxeh0uASOcZazOiBu4Ooegj9A3Ov4C9odPqISWbTdUx286WJqdzW7RZ0ZwkFOipr
oFrszAPnvg5xmlnMSa0afYgWhRXimmn2oyLt7PFfZIXX8PJnMs7x9B0+lwLLIVJRKrpU8if+gD80viC9wUJu3/jC1VF8Jg4Bq2aS7KiMX++L
Y1SKoOUUc0sHa/SFZEzuouaRGgrmU9XkM3DvzlfcrGN+/14WczAZG4st

------------
Client
------------
1. 下载服务器上的.pem文件
2. 连接
ssh -i "dsjali.pem" [email protected]
# .pem文件的权限为400,如果不是,可能报错。

axel使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--more-->
语法:
axel [options] url1 [url2] [url…]

选项:
--max-speed=x , -s x # 最高速度x
--num-connections=x , -n x # 连接数x
--output=f , -o f # 下载为本地文件f
--search[=x] , -S [x] # 搜索镜像
--header=x , -H x # 添加头文件字符串x(指定 HTTP header)
--user-agent=x , -U x # 设置用户代理(指定 HTTP user agent)
--no-proxy , -N # 不使用代理服务器
--quiet , -q # 静默模式
--verbose ,-v # 更多状态信息
--alternate , -a # Alternate progress indicator
--help ,-h # 帮助
--version ,-V # 版本信息

举例:
axel -n 10 -o /tmp/ http://www.jsdig.com/lnmp.tar.gz
# 下载安装包指定10个线程,存到/tmp/。如果下载过程中下载中断可以再执行下载命令即可恢复上次
# 的下载进度。

分区工具parted

1
2
3
4
5
6
7
8
9
10
11
12
<!--more-->
parted
select /dev/sdb #切换磁盘
mklable gpt # 切换为gpt模式
mkpart primary 0 -1 # 创建磁盘,命名为primary,0 -1表示分配所有磁盘空间
toggle 1 lvm # 将第1个分区改为lvm
print # 查看
# 这里有一个问题,分配大于2TB空间的磁盘,在查看分区时会有一个Partition 1 does not start on physical sector boundary.的提示
# 也可以使用gdisk工具分配大于2TB空间的磁盘,使用方法与fdisk类似。

unit TB # 设置单位为TB
mkpart primary 0 3 # 设置为一个主分区,大小为3TB,开始是0,结束是3

CentOS7系统升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--more-->
vim /etc/yum.repos.d/CentOS-local.repo
[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.aliyun.com/centos/7.6.18.10/os/$basearch/
gpgcheck=0
enabled=1

[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.aliyun.com/centos/7.6.18.10/updates/$basearch/
gpgcheck=0
enabled=1

yum clean all
yum repolist
yum -y update
reboot