博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux awk用法
阅读量:6912 次
发布时间:2019-06-27

本文共 2685 字,大约阅读时间需要 8 分钟。

awk是一个强大的文本分析工具,在对数据进行分析并生成报告时显得尤为强大。

使用方法:awk [options]  'BEGIN{ commands } pattern{ commands } END{ commands }'  file,其中commands都包含在大括号内。

第一步:运行BEGIN{ commands }语句块中的语句

第二步:从文件或标准输入(stdin)读取一行,以空格为默认分隔符将每行切片,然后运行pattern{ commands }语句块,逐行读取直到文件被读取完毕

第三步:读至输入流末尾时运行END{ commands }语句块

1.一个简单的awk用法实例:

[root@oldboy ~]# awk -F: '{print $1,$6}' /etc/passwdroot /rootbin /bindaemon /sbinadm /var/adm ……

其中参数-F:指定原文件以:分片,print表示打印,$1和$6表示每一行的第1片和第6片($0表示整行内容),/etc/passwd表示要处理的文件

2.使用pattern部分

上述例子表示对每一行进行处理,而使用pattern则可对满足条件的行进行处理。

例如创建一个文件b.txt

[root@oldboy ~]# cat b.txt Alice 18 girlBob   20 boy  dance bikeJane  19 girlLily  21 girl  tennis[root@oldboy ~]# awk '$2>=20{print $1,$2}' b.txt Bob 20Lily 21

$2>=20表示第2片的值大于等于20时,才进行后续的打印操作。

3.begin语句块

begin语句块是在awk匹配文件之前运行的并且只执行一次,所以在begin语句块中$n是不可用的。一般情况下可以在begin语句块中做一些变量初始化的工作,或者一些只需要在开始打印一次的内容(例如输出表的表头)。

4.end语句块

end语句块是在awk循环执行完所有行的处理之后再执行的,end语句块中的内容也只执行一次,一般用于打印一些只需在末尾输出一次的内容。

注意begin语句块、pattern语句块和end语句块都在一个单引号内,并且单引号内的需要使用双引号。(尝试外层用双引号内层用单引号,有报错)

[root@oldboy ~]# awk 'BEGIN{print "name","age","gender"} $2>=20{print $1,$2,$3} END{print "end"}' b.txt name age genderBob 20 boyLily 21 girlend

5.awk使用变量

①awk中内置变量

FILENAME:awk浏览的文件名  NF:浏览记录的域的个数  

NR:已读的记录数,如果有多个文件这个值不断累加  FNR:当前记录数,即自身文件的行号 

FS:设置输入域分隔符,等价于-F参数  OFS:设置输出域分隔符

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

ARGC:命令行参数个数  ARGV:命令行参数排列  ENVIRON:支持队列中系统环境变量的使用

[root@oldboy ~]# awk -v OFS='#' '{print "文件名:"FILENAME,"浏览记录数:"NR,"域个数:"NF,"行内容:"$1,$2} END{print "文件"FILENAME"处理完毕,行数为"NR}'  b.txt 文件名:b.txt#浏览记录数:1#域个数:3#行内容:Alice#18文件名:b.txt#浏览记录数:2#域个数:5#行内容:Bob#20文件名:b.txt#浏览记录数:3#域个数:3#行内容:Jane#19文件名:b.txt#浏览记录数:4#域个数:4#行内容:Lily#21文件b.txt处理完毕,行数为4

 ②自定义变量

[root@oldboy ~]# a=2[root@oldboy ~]# b=3[root@oldboy ~]# awk -v x=$a -v y=$b 'BEGIN{print x+y}'5[root@oldboy ~]# awk -F# 'BEGIN{COUNT=0} {count+=$2} END{print count}' a.txt  6

6.awk中的判断语句

[root@oldboy ~]# awk '$2>20{print}' b.txt Lily  21 girl  tennis[root@oldboy ~]# awk '{if($2>20) print}' b.txt Lily  21 girl  tennis[root@oldboy ~]# awk 'BEGIN{age=25;if(age>18){print "成年人"} else if(age==18){print "刚好18岁"} else{print "未成年人"} }'成年人

7.awk中的循环语句

[root@oldboy ~]# awk 'BEGIN{sum=0;i=1;while(i<51){sum+=i;i++} print sum}'1275[root@oldboy ~]# awk 'BEGIN{sum=0;i=1;do{sum+=i;i++}while(i<51) print sum }'1275[root@oldboy ~]# awk 'BEGIN{sum=0;for(i=1;i<51;i++) {sum+=i} print sum}'1275

在判断语句和循环语句中,多条语句之间用分号隔开,复合语句块用大括号括起来。

awk循环语句中使用continue跳过当前循环,使用break退出整个循环。

8.awk使用数组

[root@oldboy ~]# cat test.txt zhangsan 2 3lisi 5 6zhangsan 8 9lisi 11 12wangwu 33 11[root@oldboy ~]# awk '{sum[$1]+=$2} END{for(k in sum) print k,sum[k]}' test.txtzhangsan 10lisi 16wangwu 33

 

转载于:https://www.cnblogs.com/Forever77/p/10660095.html

你可能感兴趣的文章
Python面向对象之类的成员
查看>>
Win8上iis配置
查看>>
Confluence 6 配置 Office 转换器
查看>>
IT从业人员关注哪些问题
查看>>
Windows 2012 Hyper –V 3.0 New Functions
查看>>
maven部分插件配置demo
查看>>
Grin交易原理详解
查看>>
大数据体系【概念认知】系列-2:存储以及副本策略
查看>>
我的友情链接
查看>>
linux企业常用服务---haproxy+nginx搭建web高可用集群
查看>>
win7 断开 共享连接的操作方法
查看>>
CTSSD服务无法正常启动:Failure 4 in trying to open SV key PROCL-4/PROCL-5 clsctss_r_av2
查看>>
再议OPEN CURSOR与BULK COLLECT
查看>>
我的友情链接
查看>>
jquery attr与prop
查看>>
casatwy组件化方案
查看>>
Linux中ls对文件进行按大小排序和按时间排序
查看>>
Unix/Linux下安装NPM
查看>>
Apache与Tomcat区别联系
查看>>
洪水***源码
查看>>