您的位置:首页 > 运维架构 > Linux

Linux的AWK(一)

2016-04-07 00:00 134 查看
摘要: awk

awk脚本的结构基本如下所示:

awk ' BEGIN { print "start"} pattern { commands } END { print "end" } ' file

一个awk脚本通常由3个部分组成:BEGIN语句块、END语句块和能够使用模式匹配的通用语句块。这3个部分是可选的,它们中任何一个部分都可以不出现在脚本中。

awk的工作原理

(1) 执行BEGIN {commands}语句块中的语句

(2) 从文件或stdin中读取一行,然后执行pattern {commands}。重复这个过程,直到文件全部被读取完毕。

(3) 当读至输入流(input stream)末尾时,执行END {commands}语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块,诸如变量初始化、打印输出表格的表头等语句通常都可以写入BEGIN语句块中。

END语句块和BEGIN语句块类似。END语句块在awk从输入流中读取完所有的行之后即被执行。像打印所有行的分析结果这里汇总信息,都是在END语句块中实现的常见任务(例如,在比较过所有的行之后,打印出最大数)。它也是一个可选的语句块。

最重要的部分是pattern语句块中的通用命令。这个语句块同样是可选的。如果不提供该语句块,则默认执行{print} ,即打印每一个读取到的行。awk对于读取的每一行,都会执行这个语句块。

这就像一个用来读取行的while循环,在循环体中提供了相应的语句。

每读取一行时,它就会检查该行和提供的样式是否匹配。样式本身可以是正则表达式、条件以及行匹配范围等。如果当前行匹配该样式,则执行{}中的语句。

样式是可选的。如果没有提供样式,那么它就会默认所有的行都是匹配的,并执行{}中的语句。

awk的特殊变量

NR: 表示记录数量(number of records),在执行过程中对应于当前行号。

NF:表示字段数量(number of fields),在执行过程中对应于当前行的字段数。

$0:这个变量包含执行过程中当前行的文本内容。

$1:这个变量包含第一个字段的文本内容

$2:这个变量包含第二个字段的文本内容。

FS:设置输入域分隔符,等价于命令行 -F选项

e.g

echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" |awk '{print "Line no :"NR",No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3" "}'

Line no :1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3

Line no :2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5

Line no :3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f

用样式对awk处理的行进行过滤

$awk 'NR < 5 ' #行号小于5的行

$awk 'NR==1,NR==4 ' #行号在1到5之间的行

$awk '/linux/ ' #包含样式linux的行(可以用正则表达式指定样式)

$awk '!/linux/ ' #不包含样式linux的行

设定字段定界符

默认的字段定界符是空格。我们可以用-F "delimiter " 明确指定一个定界符:

$ awk -F : '{print $NF}' /etc/passwd

awk中使用循环

在awk中可以使用for循环,其格式如下:

for{i=0;i<10;i++} {print $i;}

或者

for(i in array) {print array[i];}

awk有很多内建的字符串控制函数,让我们认识一下其中部分函数。

length(str):返回字符串的长度

index(str,search_str):返回search_str在字符串中出现的位置。

split(str,array,delimiter):用定界符生成一个字符串列表,并将该列表存入数组

substr(str,start-position,end-position):在字符串中用字符起止偏移量生成子串,并返回该子串。

sub(regex.replacement_str,str):将正则表达式匹配到的第一处内容替换成replacement_str。

gsub(regex,replacement_str,string):和sub()类似。不过该函数会替换正则表达式匹配到的所有内容。

match(regex,str):检查正则表达式是否能够匹配字符串。如果能够匹配,返回非0值;否则,返回0。match()有两个相关的特殊变量,分别是RSTART和RLENGTH。变量RSTART包含正则表达式所匹配的起始位置,而变量RLENGTH包含正则表达式所匹配内容的长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: