awk 命令
一、简介
awk是一个报告生成器,我们可以利用awk将文本整理成“表”的样子。
awk其实是一门编程语言,它支持条件判断,数组,循环等功能。
grep,sed,awk被称为linux的三剑客。
grep更适合单纯的查找,文本匹配
sed更适合编辑匹配到的文本
awk更适合格式化文本,对文本进行较复杂格式处理。
二、awk基础
awk [options] 'program' file1, file2,...
细分语法:
awk [options] 'pattern{action}' files
1. df |awk '{print $5}' 打印第5列数据
其它说明:$0 显示整行,$NF 最后一列
2. 打印多行 df |awk '{print $1,$5}'
3.添加自定义字段
df |awk '{print $1,"abc"}'
df | awk '{print "abc":$1}'
4. BEGIN END
BEGIN:处理文本之间需要执行的操作
df |awk 'BEGIN {print "aaa","bbb"} {print $1,$2}'
df | awk '{print $1,$2} END{print "aaa","bbb"}'
5. 输入分隔符
-F指定分隔符: awk -F# '{print}' a.txt
也可以通过变量的方式指定分隔符, 内置变量FS用于指定分隔符,使用变量时需要使用-v选项:
awk -v FS='#' '{print}' a.txt
6. 输出分隔符
文本输出时指定分隔符的方法,awk的内置变量OFS来设定awk的输出分隔符
awk -v OFS="+++" '{print}' a.txt
7. 内置变量
上面我们接触到了一些awk内置变量,现在把常用的几个变量整理如下:
FS:输入字段分隔符
OFS:输出字段分隔符
NF:number of Field 字段数量
NR:行号
FNR:各文件分别计数的行号
FILENAME:当前文件名
8. 自定义变量
-v varname=value
awk -v myvar="test" 'BEGIN{print myvar}'
awk 'BEGIN{myvar="ttt";print myvar}'
9. 模式
awk [options] 'Pattern {Action}' file
模式写在{}外面
awk -F# '$1=="abc"{ print $2}' a.txt
正则
awk -F# '/^3/ {print $1}' a.txt
awk '/he{2,3}/{print $0}' a.txt
找出第一次出现abc的行,到第一次出现123的行之间的所有行
awk '/abc/,/123/{print $0}' a.txt
某列与对应的正则匹配为真
awk '$2~/abc/{print $0}' a.txt
10. 条件判断
awk -F ":" '{if($1=="tianrui") print $3}' /etc/passwd
11. 循环
awk -F ":" '{for( i=1;i<6;i++ ){if($1=="tianrui") print $0}}' /etc/passwd
12.数组
统计文档中单词出现的次数
$ cat a.txt
a b a
a
a c a
$ awk '{for( j=1;j<=NF;j++) count[$j]++ } END{ for(i in count){print i,count[i]}}' a.txt
a 5
b 1
c 1
13. 三元运算
$ awk -F: '{userType=$3<500?"系统用户":"普通用户";print $1,userType}' /etc/passw
root 系统用户
bin 系统用户
daemon 系统用户
saslauth 普通用户