Linux三剑客之awk命令详解
1、概述
Linux三剑客:grep、sed、awk。grep主打查找功能,sed主要是编辑行,awk主要是分割列处理。本篇文章我们详细介绍awk命令。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
Linux命令查询工具推荐 里面说的很详细:

2、语法
awk [选项] '执行脚本' var=value 文件列表多个以空格分隔 awk [选项] -f 脚本文件 var=value 文件列表多个以空格分隔基本使用
[root@liuchao ~]# echo seg1:seg2:seg3:seg4:seg5 | awk -F':' '{print $2$3}' seg2seg3 [root@liuchao ~]#图解:

多分隔符实例:
从”ab,cd:ef“字符串中拆分出 ”ab ef“ ,这里以”,“和":"为分隔符拆分
[root@liuchao ~]# echo ab,cd:ef | awk -F'[,:]+' '{print $1" "$3}' ab ef [root@liuchao ~]#3、BEGIN 和 END 模块
咱们知道一个文件有多行数据,执行一个awk命令时,awk会对没一样数据执行相同的命令。但是有时候希望执行像模板模式一样,在整个文件执行awk命令之前和之后做一些事情。对于这种需求,我们就需要用到BEGIN和END模块。
awk在执行输入文件执前会执行BEGIN块,在执行完输入文件所有行之后会执行END块。
BEGIN常用场景:初始化字段分隔符变量、打印页眉等。
END常用场景:执行最终计算或者打印最终摘要信息等。
实例一、统计某个文件夹下的文件占用的字节数
[root@liuchao ~]# ll 总用量 4 drwxr-xr-x 2 root root 23 3月 31 18:04 awk_test -rw-r--r-- 1 root root 84 11月 7 2019 catalina.out drwxr-xr-x 6 root root 64 3月 29 16:38 logs drwxr-xr-x 4 root root 34 12月 16 2019 nacos [root@liuchao ~]# [root@liuchao ~]# ll | awk 'BEGIN {size=0;} {size=size+$5;} END{print "当前文件夹总大小是:"size}' 当前文件夹总大小是:205 [root@liuchao ~]#实例二、统计某个文件夹下的文件占用的大小已M为单位
[root@liuchao ~]# ll | awk 'BEGIN {size=0;} {size=size+$5;} END{print "当前文件夹总大小是:"size/1024/1024"M"}' 当前文件夹总大小是:0.000195503M [root@liuchao ~]#4、运算符

#赋值运算符:a+5 [root@liuchao ~]# awk 'BEGIN{a=5;a+=5;print a}' 10 #逻辑运算符:a>2&&b>1 运算结果 和 a=1||b>1 运算结果 [root@liuchao ~]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}' 0 1 # 正则运算符 [root@liuchao ~]# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}' ok [root@liuchao ~]# echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}' ok [root@liuchao ~]# # 关系运算符 [root@liuchao ~]# awk 'BEGIN{a=5;if(a>=6){print "true"}}' [root@liuchao ~]# awk 'BEGIN{a=5;if(a>=5){print "true"}}' true # 算数运算符 说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。 [root@liuchao ~]# awk 'BEGIN{a="b";b=3;print ++a,++b}' 1 4 [root@liuchao ~]# # 三目运算符 [root@liuchao ~]# awk 'BEGIN{a="3";print a=="3"?"true":"false"}' true [root@liuchao ~]#5、常用内置变量

5.1、字符串分隔符"FS"
# 测试文件内容 [root@liuchao awk_test]# cat test1.txt test ab ac ad testb fd bd gg testc ii jj www ab testd ab ff bb dd # 在BEGIN 模块中设置 分隔符 ' ' , ”+“ 标识多个 [root@liuchao awk_test]# awk 'BEGIN{FS="[ ]+"}{print $2}' test1.txt ab fd ii ab # 在BEGIN 模块中设置 分隔符 ' ' , ”+“ 标识多个 [root@liuchao awk_test]# awk 'BEGIN{FS=" +"}{print $2}' test1.txt ab fd ii ab # 使用-F 选项设置分隔符 [root@liuchao awk_test]# awk -F' +' '{print $2}' test1.txt ab fd ii ab [root@liuchao awk_test]#5.2、字符串数量
# 测试文件内容 [root@liuchao awk_test]# cat test1.txt test ab ac ad testb fd bd gg testc ii jj www ab testd ab ff bb dd # 一个或者多个空格分隔后,分隔数量等于5个 打印 当前行记录 [root@liuchao awk_test]# awk -F ' +' 'NF==5{print $0}' test1.txt testc ii jj www ab testd ab ff bb dd [root@liuchao awk_test]#