1. 简述
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
1.1 基本用法
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’
- pattern:表示AWK在数据中查找的内容,就是匹配模式
- action:在找到匹配内容时所执行的一系列命令
1.1.1 开始块 BEGIN 语法 BEGIN {awk-commands}
开始块是程序启动的时候执行的代码部分,并且只在整个过程中执行一次,一般情况下我们可以在开始块当中初始化一些变量
它是awk的关键字,因为必须大写,但它又是可选部分,你得程序可有可无;
1.1.2 主体 BODY 语法 pattern{ commands }
对于每一个输入的行都会执行一次主体部分的命令,默认情况下,对于输入的每一行,awk都会执行命令,但是我们可以将其限定在指定的模式中
注意:在主体部分没有关键字的存在;
1.1.3 结束块END 语法 END{ commands }
它是是程序结束的时候执行的代码部分,是awk的关键字,因为必须大写,但它又是可选部分,你得程序可有可无;
1.2 参数说明
选项参数 功能
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量
1.3 awk的内置变量
变量 说明
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数
切割IP 案列
[root@Centos-root473791 ~]# ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
192.168.2.133
[root@Centos-root473791 ~]#
查询sed.txt中空行所在的行号
[root@Centos-root473791 ~]# cat sed.txt
hh hh
hh
[root@Centos-root473791 ~]# awk '/^$/{print NR}' sed.txt
2
[root@Centos-root473791 ~]#
1.3 案列
1.3.1 awk ‘{print}’ awk.txt
在命令行直接输入awk指令,逐行读取文件awk.txt内容并打印**
1.3.2. awk ‘{print $0}’ awk.txt
#逐行读取文件awk.txt内容并打印改行,$0保存的是当前行的内容**
1.3.3 awk ‘{print “hello”}’ awk.txt
#逐行读取awk.txt文件内容,每行结束后打印一个hello,文件awk.txt有多少行就打印多少个hello**
1.3.4.awk ‘{print $1}’ awk.txt
#打印awk.txt的第一列内容,在不指定分割符的情况下,awk默认使用空白做分割符**
1.3.5 awk -F “:” ‘{print $1}’ /etc/passwd
#以":"为分隔符打印/etc/passwd文件的第一例内容**
1.3.6 Shell-awk-将awk指令写入文件,通过-f选项调用
将awk指令写入文件,通过-f选项调用
vim awkscript
BEGIN{
FS=":"
}
{print $1}
awk -f awkscript /etc/passwd
1.4 begin和end
实例3:awk的BEGIN块和END块
BEGIN用于初始化FS变量(列分隔符),打印标题,或者初始化后需要在程序中调用的全局变量
END用于执行最后的运算或者打印最终的输出结果
END块和BEGIN不是必须的
1.5 在awk中使用正则匹配
1.5.1. awk ‘/Hello/{print}’ awk.txt #打印awk.txt中匹配Hello的那一行内容
1.5.2. awk -F “:” ‘/123/{print $2}’ 1.txt
#以":"为分隔符打印1.txt中匹配123的那一行中,第二列的内容
1.5.3. awk -F “:” ‘$1 ~ /root/{print $2}’ /etc/passwd
#打印/etc/passwd中,第一列匹配root的行其第二列的内容 ~表示匹配
1.5.4 使用Linux命令计算第二列的和并输出
[root@Centos-root473791 ~]# cat sum.txt
张三 40
李四 50
赵六 60
[root@Centos-root473791 ~]# cat sum.txt | awk -F " " '{sum+=$2} END{print sum}'
150
[root@Centos-root473791 ~]#