[实验] Linux 硬盘的加密 (通过 crypt 实现)

纪念:站主于 2019 年 11 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

步骤目录:

步骤一:硬盘加密后的注意事项

步骤二:生成一个新的分区
2.1 查看现有的分区
2.2 创建一个新的分区

步骤三:创建逻辑卷
3.1 创建卷组
3.2 创建逻辑卷

步骤四:给逻辑卷加密
4.1 给逻辑卷加密
4.2 解锁逻辑卷
4.3 格式化逻辑卷
4.4 锁住逻辑卷

内容五:自动挂载加密逻辑卷
5.1 修改系统自动挂载文件
5.2 创建一个映射器
5.3 创建随机密钥文件
5.4 将密钥文件设为只读为 root
5.5 将密码添到 luks 中,让密码立刻生效
5.6 测试挂载效果
5.6.1 挂载加密逻辑卷
5.6.2 测试加密效果

具体的操作步骤:

步骤一:硬盘加密后的注意事项

1) 加密后不能直接挂载
2) 加密后硬盘丢失也不用担心数据被盗
3) 加密后必须做映射才能挂载

步骤二:生成一个新的分区
2.1 查看现有的分区

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   10G  0 disk 
└─vda1 253:1    0   10G  0 part /
vdb    253:16   0   10G  0 disk 

(补充:在这里是加了一个 vdb 硬盘用来进行分区并加密)

2.2 创建一个新的分区

# fdisk /dev/vdb
命令(输入 m 获取帮助):n
分区号 (1-8,默认 1):
起始 扇区 (0-20971440,默认 0):
Last 扇区 or +扇区 or +size{K,M,G,T,P} (0-20971440,默认 20971440):+5G
分区 1 已设置为 Linux native 类型,大小设为 5 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

2.2 查看新的分区

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   10G  0 disk 
└─vda1 253:1    0   10G  0 part /
vdb    253:16   0   10G  0 disk 
└─vdb1 253:17   0    5G  0 part 

步骤三:创建逻辑卷
3.1 创建卷组

# vgcreate mysqldatavg /dev/vdb1
WARNING: sun signature detected on /dev/vdb1 at offset 508. Wipe it? [y/n]: y
  Wiping sun signature on /dev/vdb1.
  Physical volume "/dev/vdb1" successfully created.
  Volume group "mysqldatavg" successfully created

3.2 创建逻辑卷

# lvcreate -n mysqldatalv -L 1G mysqldatavg
  Logical volume "mysqldatalv" created.

步骤四:给逻辑卷加密
4.1 给逻辑卷加密

# cryptsetup luksFormat /dev/mapper/mysqldatavg-mysqldatalv

WARNING!
========
这将覆盖 /dev/mapper/mysqldatavg-mysqldatalv 上的数据,该动作不可取消。

Are you sure? (Type uppercase yes): YES
输入 /dev/mapper/mysqldatavg-mysqldatalv 的口令:
确认密码:

4.2 解锁逻辑卷

# cryptsetup luksOpen /dev/mapper/mysqldatavg-mysqldatalv mysqldata
输入 /dev/mapper/mysqldatavg-mysqldatalv 的口令:

(补充:这里的 mysqldata 是解锁后的硬件名称)

4.3 格式化逻辑卷

# mkfs.ext4 /dev/mapper/mysqldata

(注意:要先解锁了逻辑卷以后才能格式化逻辑卷)

4.4 锁住逻辑卷

# cryptsetup luksClose mysqldata

内容五:自动挂载加密逻辑卷
5.1 修改系统自动挂载文件

# vim /etc/fstab

添加以下内容:

......
/dev/mapper/mysqldata /var/lib/mysql ext4 defaults 0 0

5.2 创建一个映射器

# vim /etc/cypttab

添加以下内容:

......
mysqldata /dev/mapper/mysqldatavg-mysqldatalv /root/keyfile luks

(补充:这里的三个参数分别代表:虚拟设备名、真实设备、密码的存储文件)

5.3 创建随机密钥文件

# dd if=/dev/urandom of=/root/keyfile bs=1024 count=4

5.4 将密钥文件设为只读

# chmod 0400 /root/keyfile

5.5 将密码添到 luks 中,让密码立刻生效

# cryptsetup luksAddKey /dev/mysqldatavg/mysqldatalv /root/keyfile
输入任意已存在的口令:

5.6 测试挂载效果
5.6.1 挂载加密逻辑卷

# mount -a

5.6.2 测试加密效果

# df -h

[内容] MariaDB&MySQL 安全调优思路

内容目录:

内容一:数据库运行环境安全
1.1 保证运行数据库的系统是安全的
1.2 以最小权限用户运行数据库
1.2.1 停止数据库
1.2.2 修改数据库目录的
1.2.3 修改配置文件
1.2.4 启动数据库
1.3 将数据库版本升级到更新的版本

内容二:数据库库安全
2.1 删除所有不用的库
2.1.1 查看所有库的列表
2.1.2 删除测试库
2.2 删除所有测试库
2.2.1 方法一:手动删除所有测试库
2.2.1.1 查看所有库的列表
2.2.1.2 删除测试库
2.2.2 方法二:使用工具删除所有测试库
2.3 禁用客户端本地数据被读取
2.3.1 修改配置文件
2.3.2 重启数据库
2.4 保护数据的本地存储

内容三:数据库登陆安全
3.1 限制数据的导入导出
3.1.1 案例一:禁止数据的导入导出
3.1.1.1 修改配置文件
3.1.1.2 重启数据库
3.1.2 案例二:只允许将数据从 /root 目录导入或导出到 /root 目录
3.1.2.1 修改配置文件
3.1.2.2 重启数据库
3.1.3 案例三:不对数据作出导入和导出的限制
3.1.3.1 修改配置文件
3.1.3.2 重启数据库
3.2 删除无用和不需要的用户
3.2.1 查看所有用户
3.2.2 删除不需要的用户
3.2.2.1 删除用户的第一种方法:使用 drop 命令删除用户
3.2.2.2 删除用户的第二中方法:使用 delete 命令删除用户
3.3 强制用户使用强密码
3.3.1 修改配置文件
3.3.2 重启数据库
3.3.3 确保 validate_password_policy 被设置的参数是 MEDIUM
3.3.3.1 进入数据库
3.3.3.2 查看 validate_password_policy 参数
3.4 设置用户密码有效期
3.4.1 对于 MariaDB 和 MySQL5.7 及以下的版本无法设置有效期,只能定期修改密码
3.4.2 设置用户默认有效期的方法
3.4.2.1 修改用户密码默认的自动过期时间
3.4.2.2 让用户密码立刻过期
3.4.2.3 让用户密码永不过期
3.5 删除无密码用户
3.5.1 方法一:手动删除无密码用户
3.5.1.1 查看无密码用户
3.5.1.1.1 MariaDB 和 MySQL 5.7 及以下版本查看无密码用户的方法
3.5.1.1.2 MySQL 8.0 及以上版本查看无密码用户的方法
3.5.1.2 手动删除不需要的用户的方法
3.5.1.2.1 手动删除用户的第一种方法:使用 drop 命令删除用户
3.5.1.2.2 手动删除用户的第二种方法:使用 delete 命令删除用户
3.5.2 方法二:使用工具删除无密码用户
3.6 禁止非 root 用户 拥有 mysql.user 表访问权限
3.7 让用户只拥有最小但够用的权限
3.7.1 查看所有用户
3.7.2 数据库权限层级
3.7.3 查看每一个用户的权限
3.7.4 删除用户多余的权限

内容四:数据库网络安全
4.1 禁止或者限制远程登陆
4.1.1 禁止远程登陆
4.1.1.1 通过 MariaDB&MySQL 的配置文件禁止远程登录
4.1.1.1.1 修改配置文件
4.1.1.1.2 重启数据库
4.1.1.2 通过防火墙禁止远程登录
4.1.2 如果非要进行远程登录则要限制远程登录
4.1.2.1 限制访问数据库 TCP 端口的具体 IP 地址
4.1.2.2 禁止有较大权限的用户被远程登陆
4.2 对网络数据进行加密传输
4.2.1 生成 SSL
4.2.1.1 创建 CA 证书
4.2.1.2 创建服务端证书,并去除加密,并使用刚刚的 CA 证书进行签名
4.2.1.3 创建客户端证书,并去除加密,并使用刚刚的 CA 证书进行签名
4.2.1.4 对生成的证书进行验证
4.2.2 将 SSL 添加到 MariaDB&MySQL
4.2.2.1 将 SSL 放在指定的位置
4.2.2.2 修改配置文件
4.2.3 重启数据库
4.2.4 验证 SSL
4.2.4.1 查看 have_ssl 和 ssl 变量
4.2.4.2 查看 SSL 的状态
4.2.5 确保所有数据库用户使用 SSL
4.2.6 用户通过 SSL 连接数据库的方法

内容五:开启审计
5.1 开启审计
5.1.1 MariaDB 和 MySQL 5.7 开启审计的方法
5.1.2 MySQL 8.0 开启审计的方法
5.2 查看 MariaDB&MySQL 日志

具体的内容:

内容一:数据库运行环境安全
1.1 保证运行数据库的系统是安全的

(步骤略)

1.2 以最小权限用户运行数据库
1.2.1 停止数据库

# systemctl stop mariadb

(补充:这里以停止 MariaDB 数据库为例)

1.2.2 修改数据库目录的

# chown -R mysql /var/lib/mysql

(补充:MariaDB&MySQL 数据库数据默认存放位置是 /var/lib/mysql)

1.2.3 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

user=mysql
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

1.2.4 启动数据库

# systemctl start mariadb

(补充:这里以启动 MariaDB 数据库为例)

1.3 将数据库版本升级到更新的版本

(步骤略)

内容二:数据库库安全
2.1 删除所有不用的库
2.1.1 查看所有库的列表

> show databases;

2.1.2 删除测试库

> drop database <database>

2.2 删除所有测试库
2.2.1 方法一:手动删除所有测试库
2.2.1.1 查看所有库的列表

> show databases;

2.2.1.2 删除测试库

> drop database <database>

2.2.2 方法二:使用工具删除所有测试库

# sudo mysql_secure_installation

2.3 禁用客户端本地数据被读取
2.3.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

local-infile=0
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

2.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

2.4 保护数据的本地存储

思路如下:
1) 使用加密的文件系统存储存放数据库的数据文件
2) 使用数据库之外的存储加密产品
3) 使用其他加密产品实现适当的数据保护

内容三:数据库登陆安全
3.1 限制数据的导入导出
3.1.1 案例一:禁止数据的导入导出
3.1.1.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

secure_file_priv=null
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.1.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.1.2 案例二:只允许将数据从 /root 目录导入或导出到 /root 目录
3.1.2.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

secure_file_priv=/root/
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.2.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.1.3 案例三:不对数据作出导入和导出的限制
3.1.3.1 修改配置文件

# vim /etc/my.cnf

删除以下内容:

......
secure_file_priv=*
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.2 删除无用和不需要的用户
3.2.1 查看所有用户

> select user,host from mysql.user;

3.2.2 删除不需要的用户
3.2.2.1 删除用户的第一种方法:使用 drop 命令删除用户

> drop <user>;

3.2.2.2 删除用户的第二中方法:使用 delete 命令删除用户

> delete from mysql.user where user='<user>' and host='<host>';

3.3 强制用户使用强密码
3.3.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

plugin-load=validate_password.so
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

3.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.3.3 确保 validate_password_policy 被设置的参数是 MEDIUM
3.3.3.1 进入数据库

# mysql -p

3.3.3.2 查看 validate_password_policy 参数

> show variables like 'validate_password_policy';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| validate_password.policy | MEDIUM |
| validate_password_policy | MEDIUM |
+--------------------------+--------+
2 rows in set (0.01 sec)

(补充:MEDIUM 的含义是密码最小的长度是 8 ,并且必须要有一个特殊字符和一个数字)

3.4 设置用户密码有效期
3.4.1 对于 MariaDB 和 MySQL 5.7 及以下的版本无法设置有效期,只能定期修改密码

> alter user 'root'@'localhost' identified by '<password>';

3.4.2 设置用户默认有效期的方法
3.4.2.1 修改用户密码默认的自动过期时间

> set global default_password_lifetime=<number>;

(补充:这里的数字代表天数)

3.4.2.2 让用户密码立刻过期

> aleter user '<user>'@'<host>' password expire;

3.4.2.3 让用户密码永不过期

> aleter user '<user>'@'<host>' password expire never;

(补充:建议普通用户每 90 天修改一次密码,敏感用户每 30 天修改一次密码,服务用户每 365 天修改一次密码)

3.5 删除无密码用户
3.5.1 方法一:手动删除无密码用户
3.5.1.1 查看无密码用户
3.5.1.1.1 MariaDB 和 MySQL 5.7 及以下版本查看无密码用户的方法

> select user, host, password from mysql.user;

3.5.1.1.2 MySQL 8.0 及以上版本查看无密码用户的方法

> select user, host, authentication_string from mysql.user;

3.5.1.2 手动删除不需要的用户的方法
3.5.1.2.1 手动删除用户的第一种方法:使用 drop 命令删除用户

> drop user <user>;

3.5.1.2.2 手动删除用户的第二种方法:使用 delete 命令删除用户

> delete from mysql.user where user='<user>' and host='<host>';

3.5.2 方法二:使用工具删除无密码用户

# sudo mysql_secure_installation

3.6 禁止非 root 用户 拥有 mysql.user 表访问权限

> show grants for root@localhost \G;
> select * from mysql.user where user='test' \G;

3.7 让用户只拥有最小但够用的权限
3.7.1 查看所有用户

> select user,host from mysql.user;

3.7.2 数据库权限层级

1) 全局层级权限:是指整个数据库级别的权限,存储在 mysql.user 表中
格式:

> grant all on *.* ......
> show grants for <user>;
> select * from mysql.user where user='<user>'\G;

2) 库级层级权限:是指数据库中某个库的权限,存储在 mysql.db 和 mysql.host 表中
格式:

> grant all on <database>.* ......
> show grants for <user>;
> select * from mysql.db where user='<user>'\G;

3) 表级层级权限:是指数据库中某个库的某个表的权限,存储在 mysql.tables_priv 表中
格式:

> grant all on <database>.<table> ......
> show grants for <user>;
> select * from mysql.tables_priv where user='<user>'\G;

4) 列级层级权限:是指数据库中某个库的某个表的某一单列的权限,存储在 mysql.columns_priv 表中
格式:

> grant select(<field>,<field>) on <database>.<table> ......
> show grants for <user>;
> select * from mysql.columns_priv where user='<user>'\G;

5) 子程序层级权限:适用于已存储的子程序
create routing, alter routing, execute 和 grant 权限适用于已存储的子程序
create routing, alter routing, execute 和 grant 权限可以被授予为全局层级和数据库层级
alter routing, execute 和 grant 权限可以被授予为子程序层级,并存储在 mysql.procs_priv 表中
格式:

> grant execute on <subroutine> <database>.<table> ......
> show grants for <user>;
> select * from mysql.procs_priv where user='<user>'\G;

3.7.3 查看每一个用户的权限

> show grants for '<user>'@'<host>';

3.7.4 删除用户多余的权限

如果有全局权限(如: FILE,PROCESS,SUPER, or SHUTDOWN 等权限),就删除这些权限
格式:

> revoke <privilege> on *.* from <user>@<host>;
> flush privileages;

内容四:数据库网络安全
4.1 禁止或者限制远程登陆

(步骤略)

(
补充:
查看可以远程登录的用户的案例

> select user, host from mysql.user where host not in ('::1','127.0.0.1','localhost');

4.1.1 禁止远程登陆
4.1.1.1 通过 MariaDB&MySQL 的配置文件禁止远程登录
4.1.1.1.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

skip-networking
bind-address=127.0.0.1
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:加入 skip-networking 这一行会让 MariaDB&MySQL 不再使用和监听任何端口)

4.1.1.1.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

4.1.1.2 通过防火墙禁止远程登录
4.1.2 如果非要进行远程登录则要限制远程登录
4.1.2.1 限制访问数据库 TCP 端口的具体 IP 地址

(步骤略)

(补充:MariaDB&MySQL 数据库的默认端口号是 3306)

4.1.2.2 禁止有较大权限的用户被远程登陆

1) 有 grant option 权限的用户
2) 被给予了全局权限像是 grant all on . 权限的用户
3) 一个可以访问 mysql.user 表的用户

4.2 对网络数据进行加密传输
4.2.1 生成 SSL
4.2.1.1 创建 CA 证书

# openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
..+++
...................................+++
e is 65537 (0x10001)

# openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ca
Email Address []:

(注意:创建 CA 证书、服务端证书、客户端证书时 Common Name 必须要有值,且必须相互不一样)

4.2.1.2 创建服务端证书,并去除加密,并使用刚刚的 CA 证书进行签名

# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Generating a 2048 bit RSA private key
.............+++
...+++
writing new private key to 'server-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl rsa -in server-key.pem -out server-key.pem
writing RSA key

# openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key

(注意:创建 CA 证书、服务端证书、客户端证书时 Common Name 必须要有值,且必须相互不一样)

4.2.1.3 创建客户端证书,并去除加密,并使用刚刚的 CA 证书进行签名

# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Generating a 2048 bit RSA private key
..................+++
..............................................+++
writing new private key to 'client-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl rsa -in client-key.pem -out client-key.pem
writing RSA key

# openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key

4.2.1.4 对生成的证书进行验证

# openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK

4.2.2 将 SSL 添加到 MariaDB&MySQL
4.2.2.1 将 SSL 放在指定的位置

# mv ca.pem /home/mysql/sslconfig/ca.pem
# mv server-cert.pem /home/mysql/sslconfig/server-cert.pem
# mv server-key.pem /home/mysql/sslconfig/server-key.pem

4.2.2.2 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

ssl-ca=/home/mysql/sslconfig/ca.pem
ssl-cert=/home/mysql/sslconfig/server-cert.pem
ssl-key=/home/mysql/sslconfig/server-key.pem
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

4.2.3 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

4.2.4 验证 SSL
4.2.4.1 查看 have_ssl 和 ssl 变量

> show variables like 'have_%ssl';
> show variables like '%ssl%';

(补充:如果它们的参数为 yes ,表示服务端已经开启 SSL)

4.2.4.2 查看 SSL 的状态

> show status like 'ssl_cipher'

(补充:如果出现 “SSL:Cipher in use is DHE-RSA-AES256-SHA“ 则表示客户端已经使用 SSL 连接了)

4.2.5 确保所有数据库用户使用 SSL

> grant usage on <database>.<table> to '<user>'@'<host>' reouter ssl;

4.2.6 用户通过 SSL 连接数据库的方法

> mysql -u <user> -p -h <host> --ssl-ca=/home/mysql/sslconfig/ca.pem

内容五:开启审计
5.1 开启审计
5.1.1 MariaDB 和 MySQL 5.7 及以下版本开启审计的方法

> set global log_warning=2;

5.1.2 MySQL 8.0 及以上版本开启审计的方法

> set global general_log = on;
> set global log_timestamps = SYSTEM;

5.2 查看 MariaDB&MySQL 日志

# find /I "Access denied for user" <logfile_name>.log
# grep -i 'Access denied for user' <logfile_name>.log

(补充:中止连接、失败连接、尝试连接都将被写进日志)

[命令] Linux 命令 awk (打印文本的列)

内容目录:

内容一:awk 格式

内容二:选项
2.1 awk 的 -F 选项
2.2 awk 的 RS、ORS、FS、OFS 选项
2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别
2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式
2.3.2.2 gsub 的格式

内容三:awk 的常用内置变量

内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格
4.1.2 打印文档第 1 列和第 3 列
4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间
4.1.4 打印倒数第 2 列
4.1.5 打印每一行的行号和列数
4.1.6 打印前一个命令结果的第 5 列
4.1.7 打印前一个命令结果的第 5 列
4.1.8 打印第 2 到最后 1 列
4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符
4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符
4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符
4.2.2 将全部横杠 “-” 替换成空值后打印
4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印
4.2.4 给每一行前面添加行号后打印
4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印
4.2.6 将句号 “.” 替换成换行符后打印
4.2.7 将换行符替换成句号 “.” 后打印
4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来
4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来
4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符
4.5 案例五:awk 打印常量
4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列
4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符
4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符
4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符
4.6.7 打印前一个命令包含 Rx p 的行的第 5 列
4.6.8 打印前一个命令以 / 结尾的行的第 4 列
4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符
4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符
4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符
4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符
4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符
4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符
4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符
4.8 案例八:awk 计算
4.8.1 0 + 1 = 1
4.8.2 x = 0 + 1
4.8.3 x = 8 + 2
4.8.4 x = 8 – 1
4.8.5 2 + 3 = 5
4.8.6 2 * 3 = 6
4.8.7 3.2 + 3.5 = 6.7
4.8.8 23 除 8 余 7
4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符
4.8.10 找 200 以内 3 的倍数
4.8.11 找 100 以内 7 的倍数或者包含 7 的数
4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符
4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数
4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符
4.9.6 计算第 1 列所有值各自总共出现的次数
4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数
4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符
4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符
4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来
4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数
4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序
4.11.4 将每一列的值前面加上所属行的行号,按行打印出来
4.11.5 将每一列的值前面加上所属行的行号,按行打印出来
4.12 案例十二:awk 打印表格

具体的内容:

内容一:awk 格式

# awk <option> '<condition>{<command>}' <file>
# awk <option> ' BEGIN{<option> <command>} {<command>} END{<command>}' <file>


补充:在这里
BEGIN{ } 里的指令只执行 1 次,并且是最先执行
{ } 里的指令会一行行地执行文件里的内容
END{ } 里指令只执行 1 次,并且是最后执行

内容二:选项
2.1 awk 的 -F 选项

awk 默认是以空格分割列,但是也可以通 -F 参数指定分割每一列的符号

2.2 awk 的 RS、ORS、FS、OFS 选项

RS 全名为 Record Separator 即指定记录分隔符
ORS 全名为 Output Record Separate 即指定输出记录分隔符
FS 全名为 Field Separator 即指定字段分隔符
OFS 全名为 Output Field Separator 即指定输出字段分隔符

2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别

sub 只匹配第一个字符串,类似于 sed ‘s//’
gsub 匹配所有字符串,类似于 sed ‘s//g’

2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式

# sub (<original string or regular expression>, <substitution string>):
# sub (<original string or regular expression>, <substitution string>, <target string>)

2.3.2.2 gsub 的格式

# gsub (<original string or regular expression>, <substitution string>):
# gsub (<original string or regular expression>, <substitution string>, <target string>)

内容三:awk 的常用内置变量

1) $0 文本当前行的全部内容
2) $1 文本的第 1 列
3) $2 文本的第 2 列
4) $3 文本的第 3 列

(补充:“$” 号后面的数字以此类推)

5) NR 文本当前行的行数,也就是目前处于第几行
6) NF 文本当前行的列数,也就是目前一共有几列
7) $(NF-1) 文本倒数第一列
8) $(NF-2) 文本倒数第二列
9) $(NF-3) 文本倒数第三列
10) , 代表空格
11) \t 代表 tab 制表位,就是比一个空格更多的空格

内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.2 打印文档第 1 列和第 3 列

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.4 打印倒数第 2 列

# awk '{print $(NF-2)}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.5 打印每一行的行号和列数

# awk -F: '{print NR,NF}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.6 打印前一个命令结果的第 5 列

# df -h | awk '{print $5}'

4.1.7 打印前一个命令结果的第 5 列

# df -h / | tail -1 | awk '{print $5}'

4.1.8 打印第 2 到最后 1 列

# cat test.txt | awk '{$1="";print}' | sed -r 's/( )(.*)/\2/'


补充:
1)这里的 /etc/passwd 是要被 awk 操作的测试文件
2)这里的 $1=”” 是将第一设置为空
3)这里的 print 作用相当于 print $0

4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符

# awk -F: '{print NR,NF,$1,$NF}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符

# awk -F: '{print "\047 $1 \047"}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符

# awk -F: '$1=="root"{ $3 = '1';print  }' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.2.2 将全部横杠 “-” 替换成空值后打印

# echo "z m y z-m-y 2021-11-11 z:y" | awk 'gsub(/-/,"")'
z m y zmy 20211111 z:y

或者:

# echo eternal-center-zmy | awk 'BEGIN{ FS="-";}{print $1,$2,$3}'
eternal center zmy

4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印

# echo eternal-center-zmy | awk 'BEGIN{ FS="-";OFS="***"}{print $1,$2,$3}'
eternal***center***zmy

4.2.4 给每一行前面添加行号后打印

# cat test.txt 
eternalcenter.com-ec-myz
eternalcentre.com-ec-myz
eternalcenter.org-ec-myz
eternalcentre.org-ec-myz

# awk 'BEGIN{ OFS="." }{ print NR,$0}' test.txt 
1.eternalcenter.com-ec-myz
2.eternalcentre.com-ec-myz
3.eternalcenter.org-ec-myz
4.eternalcentre.org-ec-myz

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印

# cat test.txt 
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org


# awk -F '|' 'BEGIN{ OFS="|" }{sub(/[0-9]+/,"",$2);print$0}' test.txt 
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

或者:

# cat test.txt 
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org

# awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' test.txt 
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.6 将句号 “.” 替换成换行符后打印

# cat test.txt 
m.y.z

# awk 'BEGIN{RS=".";}{print $0}' test.txt 
m
y
z

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.7 将换行符替换成句号 “.” 后打印

# cat test.txt 
m
y
z


# awk 'BEGIN{ORS=".";}{print $0}' test.txt 
m.y.z.

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来

# awk 'BEGIN {"date"|getline d; print d}'

4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来

# content=eternalcenter

# awk '{print "$content"}'
content

# awk '{print '$content'}'
eternalcenter

(补充:awk 在使用变量时必须使用单引号 “’”,否则会把变量名称当作字符串)

4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符

# awk -F: '{print $1,$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.4.2 将冒号 ”:“ 和句号 “.” 视为分割符

# awk -F [:.] '{print $1,$10}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.5 案例五:awk 打印常量

# awk -F: '{print $1,"的解释器是:",$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列

# awk '/Failed/{print $11}' /var/log/secure

(补充:这里的 /var/log/secure 是要被 awk 操作的测试文件)

4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符

# awk -F: '/bash$/{print}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '/^[ra]/{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符

# awk -F: '$1~/root/' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符

# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.7 打印前一个命令包含 Rx p 的行的第 5 列

# ifconfig eth0 | awk '/RX p/{print $5}'

4.6.8 打印前一个命令以 / 结尾的行的第 4 列

# df -h | awk '/\/$/{print $4}'

4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符

# awk -F: '$1 ~/[0-9][0-9]$/(print $1}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符

# awk -F '/^root/,/^mysql/{print $1}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符

# awk -F: 'NR==3{print}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3==1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3!=1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3>=1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3<10{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3>10 && $3<20' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3>1000 || $3<10' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3 * $4 <100' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符

# awk -F: '$1=="root"' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.8 案例八:awk 计算
4.8.1 0 + 1 = 1

# awk 'BEGIN{print x+1}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.2 x = 0 + 1

# awk 'BEGIN{x++;print x}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.3 x = 8 + 2

# awk 'BEGIN{x=8;print x+=2}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.4 x = 8 – 1

# awk 'BEGIN{x=8;x--;print x}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.5 2 + 3 = 5

# awk 'BEGIN{print 2+3}'

4.8.6 2 * 3 = 6

# awk 'BEGIN{print 2*3}'

4.8.7 3.2 + 3.5 = 6.7

# awk 'BEGIN{print 3.2+3.5}'

4.8.8 23 除 8 余 7

# awk 'BEGIN{ print 23%8}'

4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符

# awk -F: '$3 + 10' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.8.10 找 200 以内 3 的倍数

# seq 200 | awk '$1%3==0'

4.8.11 找 100 以内 7 的倍数或者包含 7 的数

# seq 100 | awk '$1%7==0||$1~/7/'

4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符

# awk -F: 'BEGIN{total=0}{total+=$4}END{print total}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数

# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符

# awk -F: '{result=$3+$4; printf result}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.6 计算第 1 列所有值各自总共出现的次数

# awk '{a[$1]++}END{for(i in a){print i,a[$i]}}' /usr/local/nginx/logs/access.log

(补充:这里的 /usr/local/nginx/logs/access.log 是要被 awk 操作的测试文件)

4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数

# echo "z- m y 2021-11-11 z:y" | awk '$4=gsub(/-/,"")'
z m y 3 z:y

4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符

# awk -F: '{print ($3=0 ? "root": not root)}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符

# awk -F: 'BEGIN{max=1000}{id=($3>max ?$3 :"system id");print id}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来

# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'

4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数

# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log


补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例

4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序

# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log | sort -k2nr


补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例

4.11.4 将每一列的值前面加上所属行的行号,按行打印出来

# awk -F: '{ i=1;while(i<NF) {print NR,$i;i++}}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.11.5 将每一列的值前面加上所属行的行号,按行打印出来

# awk '{ for(i=1;i<NF;i++)  {print NR,$i}}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.12 案例十二:awk 打印表格

在开始打印一行,在结尾打印一行,并且将 “:” 视为分割符

# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t"  $3  "\t"  $6}END{print "Total",NR,"lines."}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

[内容] Linux 代理的设置 (全局)

内容目录:

内容一:Linux 代理环境变量的种类

内容二:环境变量的格式
2.1 没有用户和密码的格式
2.2 有用户和密码的格式

内容三;可以设置代理变量的文件

内容四:控制设置的代理
4.1 开启设置的代理
4.1.1 开启设置的代理的第一种方法
4.1.2 开启设置的代理的第二种方法
4.2 查看目前生效的代理
4.2.1 查看 http_proxy 代理
4.2.2 查看 https_proxy 代理
4.2.3 查看 ftp_proxy 代理
4.2.4 查看 socket_proxy 代理
4.2.5 查看 no_proxy 代理
4.2.6 查看 all_proxy 代理
4.3 取消目前生效的代理
4.3.1 取消 http_proxy 代理
4.3.2 取消 https_proxy 代理
4.3.3 取消 ftp_proxy 代理
4.3.4 取消 socket_proxy 代理
4.3.5 取消 no_proxy 代理
4.3.6 取消 all_proxy 代理

内容五:设置一个网络代理的案例
5.1 案例一:临时设置网络代理
5.2 案例二:永久设置网络代理
5.2.1 给配置文件添加代理配置
5.2.2 让代理配置生效
5.3 查看目前生效的代理

具体的内容:

内容一:Linux 代理环境变量的种类

1) http_proxy
2) https_proxy
3) ftp_proxy
4) socket_proxy
5) all_proxy
6) no_proxy


补充:
1) 变量可以使用通配符
2) 添加多个变量时可以使用 “,” 号分割
3) 不填种类默认以 http 协议传输

内容二:环境变量的格式
2.1 没有用户和密码的格式

export <environment variable>=http://<IP address>:<port>

2.2 有用户和密码的格式

export <environment variable>=https://<user>:<password>@<IP address>:<port>

(注意:如果密码中也有一个 “@” 符号,则需要把 “@” 符号转义一下,转义成 %40)

内容三;可以设置代理变量的文件

1) /etc/profile
2) ~/.bashrc
3) /etc/profile.d/<文件名前缀>.sh

内容四:控制设置的代理
4.1 开启设置的代理
4.1.1 开启设置的代理的第一种方法

# reboot

4.1.2 开启设置的代理的第二种方法

# source /etc/profile

4.2 查看目前生效的代理
4.2.1 查看 http_proxy 代理

# echo $http_proxy

4.2.2 查看 https_proxy 代理

# echo $https_proxy

4.2.3 查看 ftp_proxy 代理

# echo $ftp_proxy

4.2.4 查看 socket_proxy 代理

# echo $socket_proxy

4.2.5 查看 no_proxy 代理

# echo $no_proxy

4.2.6 查看 all_proxy 代理

# echo $all_proxy

4.3 取消目前生效的代理
4.3.1 取消 http_proxy 代理

# unset http_proxy

4.3.2 取消 https_proxy 代理

# unset https_proxy

4.3.3 取消 ftp_proxy 代理

# unset ftp_proxy

4.3.4 取消 socket_proxy 代理

# unset socket_proxy

4.3.5 取消 no_proxy 代理

# unset no_proxy

4.3.6 取消 all_proxy 代理

# unset all_proxy

内容五:设置一个网络代理的案例
5.1 案例一:临时设置网络代理

# export http_proxy=http://8.8.8.8:80

(补充:这里以无密码的代理 IP 和端口 8.8.8.8:8080 为例)

或者:

# setenv http_proxy=http://8.8.8.8:80

(补充:这里以无密码的代理 IP 和端口 8.8.8.8:8080 为例)

5.2 案例二:永久设置网络代理
5.2.1 给配置文件添加代理配置

# vim /etc/profile

添加以下内容:

……
export http_proxy=http://8.8.8.8:80
export https_proxy=http://admin:123@8.8.8.8:8080
export no_proxy=”localhost, 127.0.0.1, ::1″


补充:这里以设置
1) 无密码的代理 IP 和端口 http://8.8.8.8:80
2) 有密码的代理 IP 和端口 http://8.8.8.8:8080
3) 排除 localhost、127.0.0.1 和 ::1 为例
为例

(注意:如果密码中也有一个 “@” 符号,则需要把 “@” 符号转义一下,转义成 %40)

5.2.2 让代理配置生效

# source /etc/profile

5.3 查看目前生效的代理

# echo $http_proxy
# echo $https_proxy