【shell】awk命令及常见用法

时间:2023-01-30 23:55:49

【背景】

awk是linux中一个功能强大的文本处理命令。awk逐行读入数据并以字段为基本单元来组织和处理数据,对每行读入的数据都会进行条件匹配并执行对应的动作。awk常见于对文本文件中的数据执行计算、统计等操作。


【命令格式】

awk 'BEGIN {action} condition {action} END {action}' filename
awk可以以文件名作为输入或者标准输入。


【工作方式】

awk的工作方式如下:

1.执行BEGIN中的语句。

2.从输入读取一行数据,执行条件匹配,如果匹配成功则执行动作,否则不执行。继续执行此步直到输入结束。

3.执行END中的语句。


【特殊变量】

1.NR:表示读入数据的行号。

2.NF:表示当前读入行的字段数量。

3.$0:当前读入行的文本内容。

4.$1:当前读入行的第一个字段,类似的还有$2、$3等。


【常见用法】

本次用来实验的text.txt的文本内容如下:

11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2


1.输出文件的所有内容

awk '{print}' text.txt 
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2
如果不对action附带条件,则默认所有输入都符合条件。


2.输出文件的第一行数据

awk 'NR==1{print}' text.txt 
11 Tom computer-science 4.0

这里使用了前面提到的特殊变量。


3.输出匹配bio字符串的行

awk '/bio/{print}' text.txt 
13 Marry biology 3.9
使用!可以表示取反。


4.匹配多个条件

(1)例如需要打印第一行和第三行数据:

awk 'NR==1
> NR==3{print}' text.txt
11 Tom computer-science 4.0
13 Marry biology 3.9
同理,这些条件也可是正则表达式。

(2)如果需要打印第一行到第三行之间的数据:

awk 'NR==1,NR==3{print}' text.txt 
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9

注意上个例子的两个条件之间用换行符隔开,而这个例子的两个条件之间用逗号隔开。


5.使用begin和end块

例如需要输出辅助类的信息:

awk 'BEGIN{print "uid name majority gpa"} {print} END{print "***end of file***"}' text.txt 
uid name majority gpa
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2
***end of file***
这样就可以在开始和结尾处输出一些辅助信息。


6.计算平均gpa

awk 'begin{average=0} {average+=$4} END{average/=NR;print "average gpa is "average}' text.txt 
average gpa is 4


7.传递外部变量值给awk

var=1
echo | awk -v VAR=$var '{print VAR}'
echo | awk '{print VAR}' VAR=$var
有时需要将一些值传递给awk命令,就可以使用-v选项。


8.设定定界符

awk -F : '{print}' text.txt
awk 'BEGIN{IFS=":"} {print}' text.txt

awk的认为字段之间的默认定界符是空格,但有些文件并不是以空格隔开字段,此时需要调整定界符便于awk切分字段。


【待续】

上面总结了awk的基本用法,实际上awk的复杂程度类似于小型的编程语言,深入钻研还有很多内容可学。等到需要之时再来回顾吧,待续...