Linux|三剑客之AWK

Posted by 琉璃康康 on March 25, 2022

就很想吃三文鱼

学习永无止境,记录相伴相随!

—— 琉璃康康

所谓“工欲善其事,必先利其器”,一个好的工具可以让工作和生活的很多事情变得轻松和快捷,今天就简单记录一下Linux三剑客之“awk”。

awk是我使用的高频命令之一,从工作大量使用Linux系统开始,其提升了很多命令输出和log查看的效率,尤其是做虚拟化和云原生之后,在openstack和kubectl等命令的基础上更加的依赖这个强大的linux命令来不断输出自己想要的结果。

awk得名于三位创始人Alfred Aho(egrep的作者), Peter J. Weinberger和Brian Kernighan姓氏的首字母,其强大之处毋庸置疑。 ​其实awk已经不能简单说是Linux的一个命令,而是一门语言:awk程序设计语言,三位创始人将其正式定义为:样式扫描和处理语言。

它具备一个完整语言所应拥有的几乎所有的精美特性,可以通过创建非常简短的程序来读取输入的文件、为数据排序、处理数据、对输入进行计算、生成报表等等诸多功能。

awk常用语法非常简单:

1
2
awk [参数] '[条件类型]{动作}'
Note:这个大括号外只能用单引号‘’。

​最常用的一个参数当属”-F fs(field-separator)“用来指定分隔符,可以用任何字符或者正则表达式作为分隔符,不使用就默认以空格为分隔符。

awk中比较常用的动作就是print,后边跟想要打印的第几列、字符串或者一段程序;第几列是按照分隔符分隔后,从左到右依次从1到n来计算的,比如:

1
2
3
4
5
6
7
8
#源文件
coreuser@HK test % cat test                              
color, weight, comment
red, 19, red color
green, 26, green color
blue, 33, blue color
dark, 45, it is dark
white, 78, white is better
1
2
3
4
5
6
7
8
#使用默认的空格分隔打印第二列内容
coreuser@HK test % cat test | awk '{print $2}'      
weight,
19,
26,
33,
45,
78,
1
2
3
4
5
6
7
8
#使用逗号“,”分割后打印第二列内容
coreuser@HK test % cat test | awk -F"," '{print $2}'     
 weight
 19
 26
 33
 45
 78
1
2
3
4
5
6
7
8
9
#将每行中的数字分割后打印第二列内容:-F支持正则表达式
coreuser@HK test % cat test | awk -F"[0-9]*" '{print $2}'

, red color
, green color
, blue color
, it is dark
, white is better
Note:第一行因为没有任何数字,分隔后第二列为空。

print也可以通过双引号打印字符串:

1
2
3
4
5
6
7
8
coreuser@HK test % cat test | awk -F"," '{print "this color is "$1", the weight is "$2"."}'
this color is color, the weight is  weight.
this color is red, the weight is  19.
this color is green, the weight is  26.
this color is blue, the weight is  33.
this color is dark, the weight is  45.
this color is white, the weight is  78.
coreuser@HK test % 

其另一个常用的动作是printf,多了一个“f”就多了一个格式刷,可以格式化输出信息,调用格式是”printf(“”, )“,如下是通过print和printf打印的对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
coreuser@HK test % cat test | awk -F "," '{print $1$2$3}'                       
color weight comment
red 19 red color
green 26 green color
blue 33 blue color
dark 45 it is dark
white 78 white is better
coreuser@HK test % cat test | awk -F "," '{printf("%-8s %-8s %-8s\n",$1,$2,$3)}'
color     weight   comment
red       19       red color
green     26       green color
blue      33       blue color
dark      45       it is dark
white     78       white is better
coreuser@HK test % 
Note:%-8s是在变量的右边缩进8个字符。

打印数据的时候可以添加条件来选择性打印,比如下边的例子使用其内置变量NR规定从第二行开始打印:

1
2
3
4
5
6
coreuser@HK test % cat test | awk -F "," 'NR>=2{printf("%-8s %-8s %-8s\n",$1,$2,$3)}' 
red       19       red color
green     26       green color
blue      33       blue color
dark      45       it is dark
white     78       white is better

awk使用需要注意两个特殊模式BEGIN和END,BEGIN是在读取数据前可以执行的动作,END是退出前执行的动作,比如下边的例子给输出结果做个前置表头,并在结尾打印颜色的平均权重,这里在action中定义了变量和算式,可以看到action中是可以加入编程的,比如if else、for或while循环等等:

1
2
3
4
5
6
7
8
9
coreuser@HK test % cat test | awk -F "," 'BEGIN{print "This is Color Table"}{printf("%-8s %-8s %-8s\n",$1,$2,$3)}{a+=$2;b=a/5}END{print "Average Weight: "b}'
This is Color Table
color     weight   comment
red       19       red color
green     26       green color
blue      33       blue color
dark      45       it is dark
white     78       white is better
Average Weight: 40.2

综上所述,awk的使用如下

1
awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{退出前的扫尾工作}'

awk还有其他的一些参数比如”-v“定义一个变量,”-f“传递一个脚本文件,其还有很多内置变量和多种用法,需要在实战中慢慢体验摸索了。

最后,打印一个九九乘法表,继续从小学生学起。

1
2
3
4
5
6
7
8
9
10
coreuser@HK test % awk 'BEGIN{for(i=1;i<10;i++) {for(j=1;j<=i;j++) {printf "%d%s%d%s%d\t",j,"x",i,"=",i*j;}printf "\n"}}' 
1x1=1	
1x2=2	2x2=4	
1x3=3	2x3=6	3x3=9	
1x4=4	2x4=8	3x4=12	4x4=16	
1x5=5	2x5=10	3x5=15	4x5=20	5x5=25	
1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36	
1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49	
1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64	
1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81	

周末愉快^_^


网络和应用

摄影和旅行

工作和生活

欢迎关注公众号:七禾页话(qiheyehk)