2)显示包含321的行
[root@creditease awk]# awk '/321/{print $0}' awk.txt CBA#DEF#GHI#GKL$3213)以#为分隔符,显示第一列以B开头或最后一列以1结尾的行
[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$3214)以#为分隔符,显示第一列以B或C开头的行
[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321五、比较表达式
awk是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk就执行相关的action,主要是在针对某一区域做出相关的判断,比如打印成绩在80分以上的,这样就必须对这一个区域作比较判断.
下表列出了awk可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action 。
awk支持的关系运算符
运算符含义示例<小于x>y<=小于或等于 。x<=y==等于x==y!=不等于x!=y>=大于或等于x>=y>大于x<y
5.1 比较表达式实例
显示awk.txt的第2 ,3 行
NR //,//
[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt ABC#DEF#GHI#GKL$123BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321第二篇 awk模块、变量与执行完整awk结构图如下:

文章插图
一、BEGIN模块
BEGIN模块在awk读取文件之前就执行,BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等的值 。可以不接任何输入文件
二、awk内置变量(预定义变量)
变量名属性$0当前记录,一整行$1,$2,$3....$a当前记录的第n个区域,区域间由FS分隔 。FS输入区域分隔符,默认是空格 。field separatorNF当前记录中的区域个数,就是有多少列 。number of fieldNR已经读出的记录数,就是行号,从1开始 。number of recordRS输入的记录分隔符默认为换行符 。record separatorOFS输出区域分隔符,默认也是空格 。output record separatorFNR当前文件的读入记录号,每个文件重新计算 。FILENAME当前正在处理的文件的文件名
特别提示:FS RS支持正则表达式
2.1 第一个作用: 定义内置变量
[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt ABCDEFGHIGKL$123BACDEFGHIGKL$213CBADEFGHIGKL$3212.2 第二个作用:打印标识
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt =======start======ABC#DEF#GHI#GKL$123BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$3212.3 awk实现计算功能
[root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}'98 8 0.0888889 8三、END模块
END在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果) 。也可以是和BEGIN模块类似的结尾标识信息 。
3.1 第一个作用:打印标识
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt=======start======ABC#DEF#GHI#GKL$123BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321=======end======3.2 第二个作用:累加
1)统计空行(/etc/services文件)
grep sed awk
[root@creditease awk]# grep "^$" /etc/services |wc -l17[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l17[root@creditease awk]# awk '/^$/' /etc/services |wc -l17[root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services172)算术题
1+2+3......+100=5050,怎么用awk表示?
[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}'5050四、awk详解小结
1、BEGIN和END模块只能有一个,BEGIN{}BEGIN{}或者END{}END{}都是错误的 。
2、找谁干啥模块,可以是多个 。
五、awk执行过程总结

文章插图
awk执行过程:
1、命令行的赋值(-F或-V)
2、执行BEGIN模式里面的内容
3、开始读取文件
4、判断条件(模式)是否成立
推荐阅读
- 算法一看就懂之「 堆栈 」
- Android视频技术探索之旅:美团外卖商家端的实践
- 孕妇瑜伽要注意什么?
- 哪些茶称之为绿茶?
- 汽车之家|技术工程师的金三银四,没有消失
- 跑步之前吃什么好
- 武夷岩茶的闻香之法
- 茶之雅趣投茶介绍
- 国医大师何任的茶疗养生之道
- 新疆安集海大峡谷 被称为无人之境场面震撼
