awk常用例子_awk实例学习

发布时间:2019-07-17编辑:脚本学堂
awk常用例子,awk 用法及注解,awk内置变量,awk操作符,awk 内置字符串函数,awk编写脚本的例子。

一、linuxjishu/13830.html target=_blank class=infotextkey>awk 的用法及注解
 

awk -F: condition dist //这里的:是指以:为分隔,如果不用-F则默认为空格。
$0 //显示所有
$1 //显示第一列
$2 //显示第二列
$3 //显示第三列
$4 //显示第四列

例子:
 

复制代码 代码示例:
[root@xiao_linux mybash]# cat >fawk.a
1   xiao25  beijing9000
2   liuwenjing  24  beijing5000
3   weijianjun  29  shanghai8000
4   wanmingyang 28  beijing5000
5   tianzhiyu   25  beijing5500
6   zhouhaoxing 23  beijing5000
ctrl+d
//以上建立一个文件来做相应的操作。

awk '{print $2,$4}' fawk.a //这里的意思是找到第二列及第四列的内容,并且显示出来。

awk 'BEGIN {print"name   addressn----------------"}{print $1,$4}' fawk.a
指加上头部内容
awk 'BIGIN {print"name   addressn------------"} {print $1,$4} END {print "content already end"}' fawk.a
这加了尾内容

如果要查找,可以用:
 

awk '{if($2~/wei/) print $0}' fawk.a //这是精确查找
awk '$0~/wei/' fawk.a //这条就OK了。
awk '$2=="xiao" print $0' fawk.a //只匹配xiao
awk '$0!~/liu/' fawk.a //除了liu的都显示

awk '$0~/[Ll]iu/ {print $1,$2 " is my wife"}' fawk.a //查找出来的内容进行添加
awk '{if($5>=5500) print $1,$2,$5}' fawk.a
awk '$0~/(xiao|liu)/' fawk.a
awk '{if($2=="xiao" && $3=="beijing") print $0}' fawk.a
awk '{if($2=="xiao" || $2~/liu/) print $0}' fawk.a

二、awk内置变量
NR //打印出文件的记录个数
 

awk '{print $0} END {print "总共次数:" NR}' fawk.a
ll | awk '{print $0}END {print "总记录:"NR}'

NF //显示每行记录中有多少条域,简单来理解就是有多少列
 

//同时还有一个强大的功能,请看例子:
pwd
/home/myfile
echo $PWD | awk -F/ '{print $NF}'  //将取出文件名myfile"/"为分隔符

三、awk 操作符(>,==,>=.....不全介绍)
 

ll | awk '{name=$9;tt=$7;if(tt>=13) print "文件名:name",$7,$9 }'

ll | awk 'BEGIN{NUMS=13}{if($7>=NUMS) print $7,$9}'

//这一条命令也和上面同意思,可以看出可以在BEGIN中先定义一个变量,这是一个很不错的想法

还有就是域可以进行数值运算(数值域)
 

$7=$7-1 //意指值减1
ll | awk '{$10=$7+1;print $0}'
//注意上面的10域是新建的,本来是没有,意思是把7域中的数对应加1,然后赋到10域上,怎么样是不是很爽呢。

统计某列的总值
 

ll | awk '{total+=$7;print $7};END{print "总计:"total}' //统计第七列的总和
ll | awk '{if($7>=NUMS) print $7,$9}' NUMS=13
//这是给赋值,当然你可以在前面定义变量,后面引用时$NUMS
//也就是说允许环境变量
ll | awk 'total+=$5;END{print "总容量:" total}'

四、awk 内置字符串函数
 

gsub(r,s) //$0 中,s替换r
gsub(r,s,n) //$n 中,s替换r
length(s)  //s的长度
index(s,t) //返回s中t的第一位置
match(s,t) //在s中查找t匹配的,t可以用正则表达式 查找成功返回值,不成功返回"0"
split(s,a,t) //t为分隔标准,s为字符,a为数组,a[1],a[2]....
sub(t,s) //  t 为查找的,s为替换 查找第一次出行的
substr($1,1,6) // $1是指域 这个和php是一样的,不讲
printf() //这个和c差不多,不讲

ll | awk 'gsub(/xiao/,"hehe")'
ll | sed 's/xiao/hehe'
 

以上两个效果是一样的,但是第一条命令只是产生发生效果的东东。

例子:
 

ll | awk '{print length($4)}'
awk '{print lenght("hello,nice to see you!")}'

ll | awk '{print match($4,/root/)}' | sed -n '2,$p'

more fawk.a | awk '{printf("%15sn",$2)}'
 

  
附,awk 编写脚本
 

ll | awk '{total+=$5}{print $0} END{print "总数:"total}'

cat >it.awk
#!/bin/awk -f
(total+=$3)
END{print "totals age:"total}

chmod a+x it.awk
./it.awk myfile

例2:
 

#!/bin/awk -f
{total+=$3
printf("%-16s %-10sn",$2,$3)}
END{print "ok:" total}

数组处理:
 

BEGIN{
recor="343@434@24324"
split(recor,array,"@")}
END{
for(i in array) {print array[i]}
}