awk学习心得

依然是通过看sed与awk,学习了一下awk这个好用的工具。

awk模型:首先执行BEGIN{}的模块,其中可以进行一些初始化变量什么的

   然后去读文件中的每一行(根据RS),处理每一行,其中由匹配条件+操作组成{}

匹配条件可以是布尔表达式,也可以使/XX/这样的正则式

   最后执行END{}模块,可以进行一些输出,打印操作

awk -f script file:和sed的-f类似

awk -v name = value 每一个变量前面都有一个-v,这样的变量能在BEGIN模块中判断、使用

awk的系统变量:

FS:字段分割符,可以通过-F实现,默认为空格 OFS:输出的字段分割符

RS:记录分隔符,默认为换行符 ORS:输出的记录分隔符

NF:当前记录的字段个数 NR:当前是第几条记录

FILENAME:当前文件的名字 FNR:是第几个文件

CONVFMT:控制数字到字符串的转换

awk中大部分运算和布尔操作与c相同,其中有一个~、!~代表匹配和不匹配

其中字符串用空格连接,print:,表示OFS;printf为格式化打印,同c

awk向脚本传递参数:除-v,n=1的n在BEGIN中不可见,其中除-v,-f所有参数都被出入ARGV[]数组中

ARGC代表数组中元素个数,其中可以同过设置ARGC达到想数组中传递shell变量($name)的目的

awk的数组可以为关联数组,支持多维数组。可以通过for item in array遍历数组,但不保证顺序,可以通过sort排序一下,item in array可以测试是否有array[item]

ENVIRON为系统环境变量数组,但修改其值,退出脚本后,系统值并为改变,因为awk是一个拷贝副本

awk的字符串函数:

sub(r,s,t):在字符串t中,用s替换正则式r首次匹配的子字符串,成功1,没有t默认为为$0 gsub(r,s,t):替换所有的

index(s,t):返回s在t的位置,没有返回0 length(s):返回s的长度,没有s为$0

split(s,a,sep):将字符串以sep分割存入数组a中,返回存入个数

sprintf("XX",expr):将expr格式化成一个字符串,并返回,和printf规则相同但不输出

substr(s,p,n):返回字符串s中从p到n的子串,若没有n则到s的最后

tolower(s):换成小写并返回新串 toupper(s):换成大写

match(s,pattern):pattern可用/XX/或“XX”,设置了两个变量,RSTART--匹配的其实位置,RLENGTH--匹配到的字符串长度

自定义函数 function name(parameter-list) { statements }:在函数中定义的变量是全局变量,可以通过在参数中定义,把变量局部化

getline函数:用于从输入中读取新的一行到$0,1:成功 0:到了文件末尾    -1:遇到错误

getline name:把新的一行读入name,但不会改变NF,只会影响NR和FNR

getline也可以读入文件的一行:getline < "data" data为文件名

getline也可以读取管道的输出:"who am i" | getline “XX”:XX可以为带输出的shell执行语句

close()函数可以用于关闭文件和管道,例:close("who")

system()函数:执行一个以表达式方式给出的命令,例:system("mkdir dale"),成功返回0

直接输出到管道:print | “wc -w” 直接输出到文件:print > "文件" >>代表追加






猜你喜欢

转载自blog.csdn.net/cx351864995/article/details/7422052