awk教程
- 格式:docx
- 大小:803.70 KB
- 文档页数:49
Awk教程
一、awk 简介
awk是一种解释执行的编程语言,专门用来处理文本数据的。
二、awk工作流程:
Awk内部工作原理;AWK执行的流程非常简单:读( Read )、执 行( Execute )与重复( Repeat );下面是流程图:
Awk工作流程图
读( Read ):AWK 从输入流(文件、管道或者标准输入)中读入一行然后将其存入内存中。
执行(Execute):对于每一行输入,所有的 AWK 命令按顺执行。 默认情况下,AWK 命令是针对于每一行输入,但是我们可以将其限制在指定的模式中。
重复(Repeate):一直重复上述两个过程直到文件结束。
三、awk程序结构
Awk程序结构主要包括三块:BEGIN(开始块)、主体块、END(结束块);
开始块(BEGIN BLOCK):
语法:
BEGIN{awk-commands}
开始块就是awk程序启动时执行的代码部分(在处理输入流之前执行),并且在整个过程中只执行一次;一般情况下,我们在开始块中初始化一些变量。BEGIN是awk的关键字,因此必须要大写。【注:开始块部分是可选,即你的awk程序可以没有开始块部分】
主体块(Body Block):
语法:
/pattern/{awk-commands}
针对每一个输入的行都会执行一次主体部分的命令,默认情况下,对于输入的每一行,awk都会执行主体部分的命令,但是我可以使用/pattern/限制其在指定模式下。
结束块(END BLOCK):
语法:
END{awk-commands}
结束块是awk程序结束时执行的代码(在处理完输入流之后执行),END也是awk的关键字,必须大写,与开始块类似,结束块也是可选的。
示例1:
题目:有一个文本a.txt,内容如下:
1 zhengchengcheng math 100
2 wangbin chinese 80
3 wangcheng pgysical 85
4 lily english 75
5 mary history 90
使用awk将其标准输出并附带表头信息?
解答:
四、awk基本语法
Awk命令行模式:
一般情况下,我们使用awk命令行模式比较多,即直接使用awk命令处理文本数据;
Awk命令行格式如下:
awk [options] ‘{awk-commands}’ file
Awk程序文件:
当然,除了直接使用awk命令来处理文本之外,我们还可以将awk命令写成脚本来执行,即awk程序文件。
Awk程序文件执行格式如下:
awk [options] -f file
Awk标准选项:
常用的awk选项如下:
-v:这个选项可以为变量赋值,它允许在程序执行之前为变量赋值【注:一般用法即在程序执行前为变量赋值】
例如: awk -v name='xin' 'BEGIN{printf "name is: %s\n",name}'
执行结果如下:
--dump-variables[=file]:此选项会将awk全局变量及相应值按序输出到指定文件中,不指定文件,默认输出文件名是awkvars.out
执行结果如下:
awk --dump-variables=/tmp/xin '' 【注:’’引号不能少,不然会报错,代表awk主体部分;--dump-variables=/tmp/xin表示将内容输出到/tmp/xin文件中去】
--lint[=fatal]:这个选项用于检测程序的可移植情况以及代码中的可以部分,如果提供了参数fatal,awk会将所有的警告信息当错误信息输出。
例如:awk --lint '' /tmp/xin 【注:同样,强调一遍,主题部分不能省略,没处理命令使用’’代替即可,检测文件为/tmp/xin】
执行结果如下:
--profile[=file]:此选项会将程序文件以一种很优美的格式输出(常用来格式化awk脚本文件),默认输出文件是awkprof.out,[=file]表示将格式化后的脚本内容输出到指定文件。
例如:awk -F"" --profile=/tmp/awk.sh 'BEGIN{printf "No\tName\t\tCourse\tGrade\n\n"}
{print $0} END{print"\n-----The End-----"}' a.txt 【注:使用awk格式化输出a.txt内容,并将命令以一种优美的方式输出到/tmp/awk.sh文件中去】
执行结果如下:
--version:显示awk版本信息。
命令:awk --version
-F:指定域分隔符。【用来分隔每条记录中各个域的】
例如:awk -F':' '{print $1}' /etc/passwd 【注:打印系统所有的用户;$1代表第一个域】
执行结果如下:
五、awk基本示例
我们以a.txt文件作为示例文件,a.txt文件内容如下:
打印列或域:
在awk中,对于输入流,输入的每行,叫做一条记录;每一条记录中以分隔符分隔的各个部分叫做域,awk每次载入一条记录进行处理,默认的分隔符为空格。
例如:打印出a.txt文件中姓名和成绩这两列,使用awk进行操作;
命令:awk -F"" '{print $2,$4}' a.txt | column -t 【注:column -t是按比较美观的格式显示输出】
执行结果如下:
输出整行:
$0代表输出整条记录。
例如:输出姓名为wangbin的那行,用awk去实现?
命令:awk -F"" '/wangbin/{print $0}' a.txt 【这条语句先用/pattern/去匹配,匹配到后在输出整行内容】
执行结果如下:
【注:如果没有主体块(即:{print $0}),则默认是输出记录(行)】
匹配模式输出指定的列(域):
例如:输出姓名为wangbin那行中的第1,2,4列,用awk实现?
命令:awk -F"" '/wangbin/{print $1,$2,$4}' a.txt 执行结果如下:
计算匹配次数并输出:
例如:计算姓名以w开头的行的个数,用awk实现?
命令: awk -F"" '/w/{count=1;count+=1} END{print "count=",count}' a.txt
或
awk -F' ' '/w/{++count} END {printf "count is: %d\n",count}' a.txt
执行结果如下:
输出字符数多于33的行:
例如:打印输出字符串个数多于33的行,用awk实现?
命令:awk -F"" 'length($0) > 33{print $0}' a.txt
或者
awk -F"" 'length($0) > 33' a.txt
执行结果如下:
【注:length函数是awk的内置函数,该函数返回字符串的长度,变量$0表示整行,缺失的主体块会执行默认动作(打印输出);如果一行中的字符数超过33,则length($0) > 33为真,则打印输出,否则不打印】
六、awk内置变量
Awk提供了一些内置变量,在写脚本或实际运用中起到很重要的作用。 1、标准awk变量:
(1)ARGC
ARGC表示在命令行提供的参数的个数;【注:实际参数个数=ARGC -1,因为第一个参数永远是awk】
例如:awk 'BEGIN{print "arguments = ",ARGC -1}' xin ss ll w
执行结果如下:
【注:从上面可以看出,ARGC = 实际参数个数+1】
(2)ARGV
ARGV表示将命令行输出的参数存储为一个数组,ARGV即是这个数组的名称;数组的有效索引从0到ARGC-1;
例如:awk 'BEGIN{for(i=0;i = %s\n",i,ARGV[i]}}' xin ss ll w 【这条命令是循环打印出所有参数】 执行结果如下: 【注:第一个参数永远是awk,索引号为0】 (3)ENVIRON ENVIRON表示与环境变量相关的关联数组变量;【注:即使用这个内置变量可以查看当前系统环境下的环境变量设置,用法为ENVIRON[“环境变量名”]】 例如: awk 'BEGIN{print ENVIRON["HOME"]}' awk 'BEGIN{print ENVIRON["SHELL"]}' awk 'BEGIN{print ENVIRON["PATH"]}' 执行结果如下: