一、awk概述
akw是一种编程语言,主要用于在Linux和Unix下对文本和数据进行处理,是Linux和Unix下的一个工具。数据可以来自标准输入,一个或多个文件,或其他命令的输出。
awk的处理文本和数据的方式是逐行扫描文件,默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。
二、使用方法
1、命令行模式
1)格式
awk [选项] ['命令部分'] 文件名
注:命令部分为shell变量时需要用双引号
选项说明:
-F:定义字段分隔符,默认的分隔符是空格
-v:定义变量并赋值
'命令部分'说明:
正则表达式来地址定位
'/root/{awk语句}' sed中:'/root/p' //打印文件中包含root的行
'NR==1,NR==5{awk语句}' sed中:'1,5p' //打印1-5行内容
'/^root/,^ftp/{awk语句}' sed中:'/^root/,/^ftp/p' //打印root开头和ftp开头的行内人
{awk语句1;awk语句2;...}
'{print $0;print $1}' sed中:'p' //打印内容,awk语句之间需要用分号隔开
'NR==5{print $0}' sed中:'5p' //打印第5行
BGEIN...END...
'BEGIN{awk语句};{处理中};END{awk语句}'
'BEGIN{awk语句};{处理中}'
'{处理中};END{awk语句}'
2、脚本模式
#!/bin/awk -f //定义魔法字符
三、awk内部相关变量
$0:当前处理行的所有记录
$n:当前记录的第n个字段,字段间由分隔符分隔 awk -F: '{print $1,$3}'
NF:当前记录的字段数(列数) //awk -F: 'print NF'
$NF:最后一列 //$(NF-1)表示倒数第二列
FNR/NR:行号
FS:定义输入间隔符 //awk 'BEGIN{FS=":"};{print $1,$3}' 此时跟awk -F: '{print $1,$3}'是一样的
OFS:定义输出字段分隔符,默认空格 //awk -F: 'BEGIN{OFS="==>"};{print $1,$3}',输出的$1==>$3,也可以awk -F: '{print $1"==>"$3}这么写
RS:输入记录分隔符,默认换行 //awk -F: 'BEGIN{RS=" "};{print $1,$3}',相当于以 来分隔列
ORS:输出记录分隔符,默认换行 //awk -F: 'BEGIN{ORS=" "};{print $1,$3}',输出用 来分隔
四、格式化输出print和printf
1、print,类似echo
date|awk '{print "年份:"$1,"时间:"$4"}'
[xwxxh@xw shell]$ date|awk '{print "年份:" $1,"时间:" $4}'
年份:2020年 时间:星期四
2、printf,类似echo -n 不换行
awk -F: '{printf "%-15s %-10s %-15s" $1,$2,$3}' /etc/passwd
说明:%s:字符类型为字符串,%d为数字类型
%-15s:占用15个字节的字符串,'-'为左对齐方式,默认为右对齐
五、awk变量定义
#awk -v num=2 -F: '{print $num}' /etc/passwd num前加了$符号,此时会打印以:为分隔符的第num列
#awk -v num=2 -F: '{print num}' /etc/passwd num前不加$符号,此时有多少行就会打印多少个num
#awk -v num=1 'BEGIN{print num}'
#awk -v num=1 'BEGIN{print $num}',打印内容为空
注:awk中调用定义的变量时不需要加$
六、awk中BEGIN...END...的运用
1、BEGIN:表示在程序开始之间执行
2、END:表示所有文件处理完成后执行
3、用法:'BEGIN{开始处理之前};{处理中};END{处理结束后}'
七、awk的if和if...else...结构
1、if结构
格式:awk [选项] '{if(表达式) {语句1;语句2....}}' 文件名
2、if...else结构
格式:awk [选项] '{if(表达式) {语句1;语句2...} else {语句3;语句4...}}' 文件名
3、if...elif..else结构
格式:awk [选项] '{if(表达式1) {语句1;语句2...} else if(表达式2) {语句3;语句4...} else {语句5...}}' 文件名
4、for循环结构
#打印1-5
#打印1-10之间的和
5、while循环结构
#打印1-5
#打印1-10之间的和
6、嵌套循环
#命令行模式打印
#awk结构打印
7、统计/etc/passwd中shell的数量
shell[$NF]++:关联数组,awk遍历每一行,遇到相同的值就会加1