[排错] Linux 解决删除数据后依旧无法释放空间

解决方法:

步骤一:理解出现问题的原因

当删除某些数据时,此数据正在被某个进程使用,则这些数据需要 kill 掉这个进程后才能被删除掉

步骤二:查看目录的使用状态

# df -h

(注意:如果出现已用存储加剩余存储小于总存储的情况,就代表出现了被删除的数据正在被进程使用的情况 )

步骤三:查看对应目录里所有一级子目录的大小

# du -ah --max-depth=1

步骤四:查看是否有进程在使用正在被删除的数据

# lsof | grep delete

步骤五:kill 这些进程以让这些数据被成功删除

# kill -9 `lsof | grep delete | awk '{print $2}'` 

(注意:kill 进程有一定的风险,请小心执行)

[实验] 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

[命令] 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 命令 chattr (文件锁)

内容一: chattr 格式
1.1 锁定文件的格式(文件将无法被修改、追加和删除)

# chattr +i <file>

1.2 解锁文件的格式(文件将可以被修改、追加和删除)

# chattr -i <file>

1.3 锁定文件后仅可追加内容的格式(文件将无法被修改和删除,但是可以被追加新内容)

# chattr +a <文file> 

1.4 解锁文件只可被追加内容的格式(文件将取消无法被修改和删除,但红四可以被追加新内容的状态)

# chattr -a <file> 

1.5 查看文件特殊属性

# lsattr <file> 

内容二: chattr 的使用案例
2.1 案例一:锁定文件并查看文件的锁定状态
2.1.1 锁定文件

# chattr +i /etc/resolv.conf

(补充:这里以锁定 /etc/resolv.conf 文件为例)

2.1.2 查看文件的锁定状态

# lsattr /etc/resolv.conf
----i----------- /etc/resolv.conf

(补充:这里以查看 /etc/resolv.conf 文件为例)

2.1.3 解锁文件

# chattr -i /etc/resolv.conf

(补充:这里以解锁 /etc/resolv.conf 文件为例)

2.2 案例二:锁定文件后仅可追加内容并查看文件的锁定状态
2.2.1 锁定文件后仅可追加内容

# chattr +a /etc/hosts

(补充:这里以锁定 /etc/hosts 文件为例)

2.2.2 查看文件的锁定状态

# lsattr /etc/hosts
----a---------- /etc/hosts

(补充:这里以查看 /etc/hosts 文件为例)

2.2.3 解锁仅可追加内容的文件

# chattr -a /etc/hosts

(补充:这里以解锁 /etc/hosts 文件为例)