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每接收文件的一行,然后执行相应的命令,来处理文本。

2、语法

awk [选项] '执行脚本' var=value 文件列表多个以空格分隔
awk [选项] -f 脚本文件 var=value 文件列表多个以空格分隔

基本使用

[root@liuchao ~]# echo seg1:seg2:seg3:seg4:seg5 | awk -F':' '{print $2$3}'
seg2seg3
[root@liuchao ~]#

图解:

Linux三剑客之awk命令详解_第1张图片

多分隔符实例:

从”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、运算符

Linux三剑客之awk命令详解_第2张图片

#赋值运算符: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、常用内置变量 

Linux三剑客之awk命令详解_第3张图片

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]#

你可能感兴趣的:(linux,linux,运维,awk)