Linux
Linux复习归纳7~
awk
AWK适合文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。它是以文件的一行作为处理单位。
格式
awk '{pattern + action}' {filenames} //其中pattern表示查找的内容,action是找到匹配内容后执行的一系列命令
举个简单的例子
1. echo ok | awk '{print "hello,world"}' //输出hello,world
2. echo ok | awk '{print $0}' //输出ok
3. awk '{print "ok"}' /etc/passwd //若passwd文件有n行,那么会输出n行ok
4. awk '{print $0}' /etc/passwd //原样输出passwd文件
对于一条数据nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
来说:
$0 //代表一整行的数据
$1~$n //分别代表一行中不同段的数据
NF //代表字段的数量
NR //代表记录的数量(一行代表一条记录)
FS //代表字段的分隔符(默认为空格,对于上面的数据为:)
RS //代表记录的分隔符(默认为\n)
指定分隔符
对于这个字段分隔符,我们可以通过-F来指定(可以同时指定多个分隔符),具体用法是:
$ awk -F ":" '{print "name:" $1 "\tuid:" $3}' /etc/passwd
除此之外还有另一种方法:
$ awk '{BEGIN{FS=":"} {print "name:" $1 "\tuid:" $3}}' /etc/passwd
比如查找一个文件从第5行到第8行的内容:
$ awk '{if(NR>=5 && NR<=8) print $0}' test.txt
BEGIN和END模块
在一些情况下,需要在awk处理文本文件前执行初始化代码(比如用于定义全局变量),该代码存储在BEGIN块中。
在一些情况下,也需要在awk处理完文本文件的全部内容后执行某些代码块(比如用于最终计算)。这时可以将该代码存储在END块中。
比如输出passwd文件内容并计算得到行数:
$ awk 'BEGIN {count=0;} {count+=count;print $0} END {print "count is ",count}'
注意点
1. 关系运算符可以用作数值比较,也可用作字符串比较(双方都是数字,自动看作数值比较,否则即为字符串比较)
- 所有算术运算符的操作,都会将操作数自动转为数值(字符串也会自动转为数值,非数值都变为0)
支持的结构
条件语句
awk支持if、elseif、else的条件语句
循环语句
awk支持while、do…while循环语句,也支持for循环语句(for循环支持标准和for…in)
跳转语句
awk支持break、continue等跳转语句
数组
awk数组属于关联数组,数字索引会转变为字符串索引(数组的下角标为字符串),因此数组默认是无序的。
printf()输出
当然,awk也兼容C中的printf()函数的用法,两者用法一致。
常用字符串函数
sub(Ere, Repl, [ln]) //用Repl替换ln中Ere指定的正则表达式的第一个匹配值,返回替换的数量
gsub(Ere, Repl, [ln]) //用Repl替换ln中Ere指定的正则表达式的全部匹配值,返回替换的数量
index(string1, string2) //判断string2是否在string1中出现,若出现返回第一次出现的下标(下标从1开始),否则返回0
length(string) //返回string的长度
match(string, Ere) //返回string中出现Ere指定的正则表达式的位置(下标从1开始),否则返回0
substr(string, M, [N]) //截取string中[M, M+N-1]的子串,若未指定N,则直到string尾部
tolower(string) //全部转小写
toupper(string) //全部转大写
sprintf(Format, Expr...) //格式化字符串
split(string, A, [Ere]) //将string根据指定分隔符Ere将其分割为字符串数组A[1]..A[n]
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢