首页 > 代码库 > linux awk详解与应用

linux awk详解与应用

文章来自于本人个人博客:linux awk详解与应用

1.awk 

    awk是一个强大的文本分析工具,它可以通过分析文本来生成一个数据报告。它的原理就是读取每行的输入,然后按照分隔符切分(默认是空格),再进行定制计算。    

awk ‘{print $1}‘ /etc/passwd   #打印出passwd文件的所有行的第一列

    这是awk的基础语法,在awk中$n代表列数,即$1--第一列,$2---第二列....,但是$0代表整行

    接下来我们按照指定的分隔符打印数据:

awk -F ‘:‘ ‘{print $1}‘ /etc/passwd  #将每行按照冒号分隔,打印第一列

    

    现在我们来用另外一种awk的写法打印上图的输出

cat /etc/passwd | awk -F ‘:‘ ‘{print $1}‘

     

    awk有一些必须掌握的参数:

ARGC     命令行参数个数
ARGV     命令行参数排列
FILENAME AWK浏览文件的文件名
FNR      浏览文件的记录数
FS       设置输入域分隔符,跟-F一样
NF       域的索引,即列号
NR       awk读取的当前行号
OFS      输出域分隔符
ORS      输出记录分隔符
RS       控制记录分隔符

    现在我们来打印第一列,当前行号,列号的值

cat /etc/passwd | awk ‘{print "cols:",$1," rowNumber:",NR," colNumber:",NF}‘

    

    awk的语法结构为 awk ‘BEGIN{statements}  {statements}  END{statements}‘  其中在BEGIN中的语句是初始化一些变量或者打印一些初始数据的地方,在中间的{}中是进行一些逻辑运算的地方,在END{}中的语句是在计算完成输出之后需要追加的一些输出

cat /etc/passwd | awk ‘BEGIN{count=0} {count=count+1;print "count=",count} END{print "END",NR}‘

    

    再来看看awk的for和while操作:

ls -l | awk ‘BEGIN {print user,time,row} {for(i =0; i< FNR;i++) {print $3,$7,NR}}‘  #按照总行数循环打印出第三列和第七列,还有行数

    

ls -l | awk ‘BEGIN{print "begin "} {print $0;count=0;while (count < 2) {print $9;count=count+1;} print "count=",count}‘

    运用awk计算当前文件夹下文件的总大小

ls -l | awk ‘BEGIN{count=0} {count = count + $5;} END{print "total=",count}‘

    

  awk的内置函数

数值计算函数:
cos(x)    余玄
sin(x)    正玄
exp(x)    x的冥
log(x)    x的对数
sqrt(x)   x的平方
int(x)    x转换为整数
rand()    返回任意数字n (0<n<1)

字符串函数:
sub(Ere,Repl,[In])      用Repl参数指定的字符串替换In参数指定的字符串中的由Ere参数指定的扩展正则表达式的第一个具体值
gsub(Ere,Repl,[In])     除了正则表达式所有值会被替代这点,它与sub是一样的行为
index(string1, string2) 返回string1中存在string2的位置
length([string])          返回字符串的长度,如果不加参数,则返回整个记录的长度
blength([string])       返回以字节为单位的字符串长度,其余等同于length
substr(string,M,[N])   返回以M处开始,N结束的子串,如果N为空,则返回从M到length()的子串
match(string,Ere)     如果字符串匹配正则表达式,则返回出现的位置,从1开始,如果没有,则返回0
split(string,A,[Ere])  将字符串按照分隔符分为A数组,如果不按照Ere正则分隔,则会以FS来分隔字符串
tolower(string)
toupper(string)

时间函数:
mktime(YYYY MM DD HH MM SS [DST])
strftime([format[,timestamp]]) 格式化时间
systime()  得到时间戳
ls -l | awk ‘{str=$9;print "before=",str; sub(/.py*/,"",str); print "after=",str}‘

     

ls -l | awk ‘{str=$9;print str; data=http://www.mamicode.com/substr(str,0,index(str,"."));print data}‘  #substr函数去掉文件后缀名>