一、awk介绍
1.1 awk概述
- 逐行读取输入的文本内容,默认以空格和tab键做为分隔符,但是多个空格或者tab键会自动压缩成一个。按照指定的模式或者条件执行编辑命令,是功能最强大的文本工具(针对文本内容)
- 逐行匹配,对符合条件的内容才会进行格式化输出或过滤
- 可以在免交互的情况下实现复杂的文本操作,完成自动化的配置
1.2 awk命令格式
二、awk常用操作命令及选项
2.1 内置变量介绍
NR | 需要处理的行号 |
FS | 列分割符,和-F作用一致 |
OFS | 输出内容的列分隔符 |
NF | 表示最后一个字段 |
2.2 打印操作
文件行号和内容都打印
打印指定行
指定连续行数打印
指定不连续的行数打印
打印奇数行和偶数行
2.3 运算
2.4 按行取列
2.5 -F选项
指定分割符,如果分隔符是空格或者tab键可以不加
示例:过滤出文件中的主机名前缀
2.6 条件判断打印
精准筛选用法:
$(><==) | 进行数值对比 |
$n~"字符串" | 代表此字段包含某个字符串 |
$n!~"字符串" | 代表此字段不包含某字符串 |
$n=="字符串" | 代表此字段和此字符串相同 |
$n!=="字符串" | 代表此字段不为此字符串 |
示例1:输出etc/passwd文件中最后一列包含bash的所在行的第一个字段和最后一个字段
示例2:输出/etc/passwd文件中第一列是root的行的第6列
示例3:输出/etc/passwd文件中最后一个字段不包含bash的行的第1和第6列
示例4:输出/etc/passwd文件中第六个字段为/home/ovo并且最后一个字段为/bin/bash的行的第一和最后一列
示例5:输出/etc/passwd文件中所有第三列大于五百的行
也可以用if语句进行筛选输出
2.7 三元表达式
格式:
awk '{条件表达式1?A表达式或者值:B表达式或者值}' 文件名
示例:
2.8 根据文本内容匹配过滤并打印
匹配行开头或结尾内容
示例:
匹配包含内容
示例:
2.9 getline函数
getline和管道符以及重定向符号在一块的时候才有特殊功效
|:输出指定内容到定义的变量,getline调用变量中的内容,打印结果
getline既没有重定向也没有管道符时,相当于输出奇数行后者偶数行
原因:getline函数运行之后,会改变awk的内置变量,读取的行数也就发生变化,getline在前就是跳过第一行,打印第二行;getline在后就直接打印然后跳过一行
2.10 -v选项
变量赋值,不能从外部获取变量值,只能在内部赋值
示例1:
示例2:
2.11 BEGIN模式
对变量初始化:
2.12 awk和数组结合使用
示例1:
示例2:通过数组遍历的方式去重并展示结果
2.13 awk的取小数点后几位和保留整数
三、总结练习
3.1 监控系统的内存、磁盘使用情况
内存监控:
用used/total
磁盘使用情况:
写入函数库:
3.2 统计/etc目录下所有文件大小的总和
[root@pup1 ~]# ll /etc/ | awk '/^-/{sum+=$5} END{print "文件总大小:"sum/1024"M"}'
文件总大小:976.188M
#文件在ll的展示结果下以-开头,所以筛选出以-为首的行,然后进行第五列字段的相加
3.3 统计磁盘已用容量
[root@pup1 ~]# df | awk 'NR>1{sum+=$3} END{print "磁盘的已用容量为:"sum/1024/1024"G"}'磁盘的已用容量为:8.42375G