awk
转载请注明来源:https://www.cnblogs.com/hookjc/
awk 的用法及注解awk -F: condition dist //这里的:是指以:为分隔,如果不用-F则默认为空格
首先对解释
$0 //显示所有
$1 //显示第一列
$2 //显示第二列
$3 //显示第三列
$4 //显示第四列
......
在我个人理解和sed结合太完美了,这是按列哦。。。
[root@xiao_linux mybash]# cat >fawk.a
1 xiao 25 beijing 9000
2 liuwenjing 24 beijing 5000
3 weijianjun 29 shanghai 8000
4 wanmingyang 28 beijing 5000
5 tianzhiyu 25 beijing 5500
6 zhouhaoxing 23 beijing 5000
ctrl+d
//以上建立一个文件来做相应的操作。
awk '{print $2,$4}' fawk.a //这里的意思是找到第二列及第四列的内容,并且显示出来。
怎么样是不是很爽呢?
awk 'BEGIN {print"name address\n----------------"}{print $1,$4}' fawk.a
这就更爽了 意指加上头部内容
awk 'BIGIN {print"name address\n------------"} {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("%15s\n",$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
或者
#!/bin/awk -f
{total+=$3
printf("%-16s %-10s\n",$2,$3)}
END{print "ok:" total}
对于数组可以这样处理
BEGIN{
recor="343@434@24324"
split(recor,array,"@")}
END{
for(i in array) {print array[i]}
}