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包含正则表达式所匹配内容的长度。
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包含正则表达式所匹配内容的长度。
相关文章推荐
- linux中的swap
- Linux内核如何装载和启动一个可执行程序
- 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结
- 启动文件系统Kernel panic - not syncing: Attempted to kill init! 报错
- 例解 Linux 下 Make 命令
- Linux高性能服务器编程笔记1
- Linux 升级 Python 至 3.x
- Linux 升级 Python 至 3.x
- Linux 常用命令
- Linux下安装JDK1.8
- Linux内核分析第七周总结
- win10 与ubuntu14.04.4 LTS双系统时间不统一解决
- 20135302魏静静——linux课程第七周实验及总结
- [转]红帽 Red Hat Linux相关产品iso镜像下载【百度云】
- Linux内核第七节 20135332武西垚
- 解决Couldn't resolve host 'mirrorlist.centos.org
- Linux环境搭建:2. 安装Ubuntu虚拟机
- Linux内核分析——可执行程序的装载
- linux ip地址更换自动脚本
- 安装并配置TeXLive