Linux三剑客-awk
1、四剑客对比
四剑客 | 特点 | 擅长 |
---|
find | 查找文件 | 查找文件,与其他命令配合 |
grep/egrep | 过滤 | 过滤速度最快 |
sed | 过滤,取行,替换,删除 | 替换,修改文件内容,取行 |
awk | 过滤,取行,取列,统计计算,判断,循环 | 取列,取行,统计计算 |
2、命令格式
awk 选项 ‘条件{动作}’ /etc/passwd
条件 找谁
动作 干啥
3、执行流程
4、常见的选项及说明
参数选项 | 说明 |
---|
-F | 指定字段分隔符 默认是空格 |
-v | 定义或修改一个awk内部的变量 |
5、常见的变量及属性
变量 | 属性 |
---|
$0 | 当前整行记录 |
$n | 记录第n列 |
NF | 列的个数,包含多少列 $NF就是最后一列 |
$(NF-n) | 第NF-n列,例NF=7 n=1 就是第6例 |
NR | 行的符号 |
END{} | 内容会在awk读取完成文件的时候执行,一般用于输出执行结果 |
6、支持的运算符号
运算符 | 说明 |
---|
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
&& | 并且 and符 |
|| | 或者 |
~ | 包含 |
7、取行案例
7.1 取出/etc/passwd的第三行
awk 'NR==3' /etc/passwd
相当于
awk 'NR==3{print $0}' /etc/passwd
7.2 取出第二行到第五行的内容
awk 'NR>=2 && NR<=5' /etc/passwd
7.3 过滤包含root和nobody的行
awk '/root|nobody/' /etc/passwd
7.4 过滤从root到nobody的行
awk '/root/,/nobody/' /etc/passwd
8、取列案例
8.1 取出ls -lh的大小列和最后一列
ls -lh|awk '{print $5,$NF}'
输出结果对齐可使用以下参数
ls -lh|awk '{print $5,$NF}'|column -t
or
ls -lh|awk '{print $5"\t"$NF}'
8.2 取出/etc/passwd中的第 1列,第3列和最后一列
awk -F ":" '{print $1,$3,$NF}' /etc/passwd
-F
8.3 指定复杂分隔符取出ip
ip a s eth0|awk 'NR==3'|awk -F'[ /]+' '{print $3}'
9、取行和取列案例
9.1 取出权限部分 stat /etc/hosts的0644部分
stat /etc/hosts|awk -F "[(/]" 'NR==4{print $2}'
or
stat /etc/hosts|awk -F "[^0-9]+" 'NR==4{print $2}'
9.2 使用一条awk命令取ip
ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
or
ip a s eth0|awk -F "[inet /24]+" 'NR==3{print $2}'
9.3 取出/etc/passwd文件中 第3列大于大于100的行,取出这行的第1列,第3列和最后一列
awk -F ":" '$3>100{print $1,$3,$NF}' /etc/passwd
9.4 如果系统swap使用超过0则输出"监控异常 系统开始占用swap"
free |awk 'NR==3 && $3>=0{print "监控异常,系统开始占用swap"}'
or
free |awk '/Swap/ && $3>=0{print "监控异常,系统开始占用swap"}'
9.5 过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列
awk -F ":" '$4 ~ /^[01]/{print $1,$3,$4}' /etc/passwd
10、awk统计与计算
10.1 统计次数
awk '{i=i+1}END{print i}' /etc/passwd
可以简写为
i=i+1 ==i++
10.2 计算求和
awk -F ":" 'NR<=3{num=num+$3}END{print num}' /etc/passwd