awk是Linux中的一种强大的文本处理工具,用于对结构化文件进行数据的提取和处理。下面详细介绍一下awk命令的用法。
1. 基本格式
awk ‘pattern {action}’ filename
其中,pattern是用于匹配数据的模式,可以使用正则表达式;action是在匹配到模式时执行的操作,可以是打印、计算、修改等操作;filename是要处理的文件名。
2. 数据提取
使用awk命令可以方便地从文件中提取所需的数据。通过使用特定的字段分隔符,可以按列提取数据。
例如,打印文件中第一列的数据:
awk ‘{print $1}’ filename
打印文件中第一列和第二列的数据:
awk ‘{print $1, $2}’ filename
3. 数据过滤
可以使用awk命令对数据进行筛选,只打印满足条件的行。
例如,筛选出第二列等于某个值的行:
awk ‘$2 == value’ filename
筛选出某行中任意列的值满足条件的行:
awk ‘/pattern/’ filename
4. 数据计算
awk还支持对数据进行简单的计算操作,如求和、平均值等。
例如,计算某列的和:
awk ‘{sum += $1} END {print sum}’ filename
计算某列的平均值:
awk ‘{sum += $1} END {print sum/NR}’ filename
其中,NR表示行号,也即总行数。
5. 自定义处理
使用awk命令还可以进行自定义的数据处理,如添加新字段、修改字段值等。
例如,添加一列,显示行号:
awk ‘{print NR, $0}’ filename
修改某列的值:
awk ‘{if ($1 > 10) $1 = 10; print}’ filename
Linux系统中基于文本行处理的文本文件工具除了sed外还有AWK。而AWK比sed提供了更丰富的文本处理功能,不需要标明增删改也可输出满足需求的信息,除此之外还可以添加额外可执行的命令等,接下来我们详细介绍一下。
一、AWK命令的基本介绍
AWK 是一种处理文本文件的强大文本分析工具。它诞生于20世纪70年代末期,这也许是它影响了众多 Linux 用户的原因之一。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
二、AWK命令的工作原理
AWK是从文件中逐行读入(即文件的第一行到最后一行),查找匹配条件的目标文本行,如果模式匹配成功,则使用默认分隔符将一行内容分隔成各个部分并保存到内建变量中,然后按制定的指令执行命令。
三、AWK命令的基本格式
awk [选项] '脚本命令' 文件名
选项以及含义
常用内置变量
常见表达式
四、AWK命令的使用案例
操作文件展示
[admin@localhost ~]$ cat passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例1_常规操作解读
[admin@localhost ~]$ awk -F: '{print $1,$7}' passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
解读:
1)AWK命令默认从文件中读入一行文本内容,并将其赋给内置变量$0。
2)通过使用-F指定的分隔符将读入的一行文本内容分解成字段,每个字段存储到已编号的变量中,从$1至$n。
3)通过print函数打印指定的字段列,这里打印字段1与字段7。
案例2_BEGIN与END
[admin@localhost ~]$ awk 'BEGIN{FS=":"; print "处理分隔符"FS"标识"}{print $0}END{print "共"NR"行,每行"NF"列"}' passwd
处理分隔符:标识
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
共3行,每行7列
解读:
1)AWK命令从文件中读取第一行文本内容之前先执行BEGIN后面的指令,且执行1次。
2)之后读取文本中的每一行并将其保存到$0变量中,进行输出打印。默认分隔符是空格或制表符,而这里在BEGIN中将分隔符设置成冒号。
3)当文本中的所有行都处理完之后,最后执行END后面的指令,且也执行1次。从上面的执行结果我们是可以看出这些效果的。
案例3_添加逻辑处理文本内容
1)定义脚本文件 aa
[admin@localhost ~]$ vim aa
BEGIN{FS=":"} \
{ \
print "--------处理第"NR"行--------"; \
for(i=0;i<=NF;i++){ \
if(i%2!=0){ \
print $i \
} \
} \
}
2)执行脚本命令,及展示执行效果
[admin@localhost ~]$ awk -f aa passwd
--------处理第1行--------
bin
1
bin
/sbin/nologin
--------处理第2行--------
daemon
2
daemon
/sbin/nologin
--------处理第3行--------
adm
3
adm
/sbin/nologin
解读:
1)AWK命令根据-f指定的外部aa脚本文件对passwd文件的每一行进行处理。
2)aa脚本通过BEGIN表达式重置了默认分隔符为冒号;然后对每一行使用冒号进行分隔成多个字段列,这里只对奇数列字段进行打印。
3)通过效果展示看出,每一行通过冒号分隔后变成7列,只打印出1、3、5、7列字段。
案例4_AWK指令中操作数组
[admin@localhost ~]$ awk 'BEGIN{args=0;FS=":"}{arr[args++]=$args}END{for(i=0;i<args;i++){print arr[i]}}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon
x
解读:
1)通过BEGIN重置分隔符为冒号,并预定义变量args=0。
2)将每一行分隔成字段,取出args对应的字段列并设置到数组arr中。
3)所有行处理完后,再执行END中的指令,即遍历打印数组中的内容。
特别说明一下,AWK中数组的下标被称为关键字key。值和关键字都存储在内部的一张key/value的hash表格中。数组和变量一样,都是在使用时自动创建的。通常AWK中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
五、总结
AWK是一种编程语言,用于在linux/unix下对文本和数据进行处理。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。AWK的数据可以来自标准输入、一个或多个文件,或其它命令的输出。AWK可以在命令行中使用,但更多是作为脚本来使用。AWK如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。