awk功能与sed类似,都是用来进行文本处理的,awk语言可以从文件或字符串中基于指定规则浏览和抽取信息。
awk编程模型如下:
awk程序由一个主输入循环维持,主输入循环反复执行,直到终止条件被触发。但是主输入循环框架无需程序员编写,awk已经搭好主输入循环框架,程序员写的代码被嵌入到主输入循环框架中执行。主输入循环框架自动依次读取输入文本行,以供处理,而处理文件行的动作是由程序员添加的。
awk还定义了两个特殊的字段:BEGIN和END。BEGIN用于在主输入循环之前执行,即在未读取输入文件行之前执行。END用于在主输入循环之后执行,即在读取输入文件行完毕后执行。
awk有三种调用方式:
1、在shell命令行输入命令调用awk,格式为
awk [-F 域分隔符] 'awk 程序段' 输入文件
2、将awk程序段插入脚本文件,然后通过awk命令调用它,格式为
awk -f awk脚本文件 输入文件
3、将awk命令插入脚本文件后,最常用的方法是设置该脚本文件为可执行,然后直接执行该脚本文件,格式为
./awk脚本文件 输入文件
与awk编程有关的10个主题
1、awk模式匹配(举例说明)
awk '/^$/{print "This is a blank line."}' input
2、记录和域
awk认为每个输入文件是结构化的,awk将每个文件输入行定义为记录,行中的每个字符串定义为域,域之间用空格、Tab键或其他符号进行分隔,分隔域的符号叫分隔符。awk定义域操作符$来指定执行动作的域,域操作符$后面跟数字或变量来标识域的位置。每条记录的域从1开始编号。$1标识第一个域,$2标识第二个域,$0标识所有的域。另外域操作符$后可以跟变量或变量运算表达式,如$(one+two)。
3、关系和布尔运算符
awk定义了一组关系运算符用于awk模式匹配
<:小于。
>:大于。
<=:小于等于。
>=:大于等于。
==:等于。
!=:不等于。
~:匹配正则表达式。
!~:不匹配正则表达式。
awk进行模式匹配时,常用到条件语句,有if、if/else、if /else else,举例如下
awk ‘BEGIN {FS=":"} {if($3<$4) print $0}' /etc/passwd
awk定义了布尔运算符
||:逻辑或。
&&:逻辑与。
!:逻辑非。
4、表达式
awk算术运算符
+:加。
-:减。
*:乘。
/:除。
%:模。
^:乘方。
++x:前自增。
x++:后自增。
5、系统变量
awk常见环境变量及其意义
$n:当前记录的第n个域。
$0:记录的所有域。
ARGC:命令行参数的数量。
ARGV:命令行参数的数组。
ENVIRON:环境变量关联数组。
ERROR:最后一个系统错误的描述。
FILENAME:当前文件名。
FS:字段分隔符,默认是空格。
IGNORECASE:为真时匹配时忽略大小写。
NF:当前记录中的域数量。
NR:当前记录数。
OFS:输出域分隔符,默认是空格。
ORS:输出记录分隔符,默认是换行符。
RS:记录分隔符,默认是换行符。
6、格式化输出
awk定义了printf输出语句进行格式化输出,基本格式
printf{格式控制符,参数}
printf修饰符及其意义
-:左对齐。
width:域的步长。
.prec:小数点右边的位数。
printf格式符及其意义
%c:ASCII字符。
%d:整型数。
%e:浮点型,科学计数法。
%f:浮点数。
%o:八进制数。
%s:字符串。
%x:十六进制数。
7、内置字符串函数
awk提供了强大的字符串函数,用于实现文本的字符串替换、查找以及分隔等功能。
awk字符串函数及其意义
gsub(r,s):在输入文件中用s替换r。
gsub(r,s,t):在t中用s替换r。
index(s,t):返回s中字符串第一个t的位置。
length(s):返回s的长度。
match(s,t):测试s是否包含匹配t的字符串。
split(r,s,t):在t上将r分成序列s,其中s为数组。
sub(r,s,t):将t中第一次出现的r替换成s。
substr(r,s):返回从字符串r中从s开始的后缀部分。
substr(r,s,t):返回从字符串r中从s开始长度为t的后缀部分。
8、向awk脚本传递参数
变量赋值放在脚本之后,输入文件之前,格式为
awk 脚本 parameter=value 输入文件
9、条件语句和循环语句
条件语句if的语法如下
if (条件表达式)
动作1
[else
动作2]
while语句语法如下
while (条件表达式)
动作
do-while语句语法如下
do
动作
while (条件表达式)
for循环语句语法如下
for (设置计数器初值;测试计数器;计数器变化)
动作
10、数组
数组的基本格式
array[index]=value
且数组是关联数组,下标可以是数字也可以是字符串。
awk特别定义了一种for循环用来访问关联数组,语法如下
for (variable in array)
do something with array[variable]
以上是awk编程的基础内容。