设为首页 收藏本站
查看: 3471|回复: 2

[经验分享] Awk报告生成器

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-12-1 09:48:05 | 显示全部楼层 |阅读模式
一、awk概念以及使用格式
    Awk是一个强大的报告生成器,awk自身具有遍历的功能,支持条件循环,就是一个编程语言,awk 的输出  1、print命令 后接各项目使用逗号分割,而输出时则使用输出符分割。2、输出是个字符串或数值,当记录的字段、变量或awk的表达式:数值会被隐式转换为字符串后输出。3、print后面如果省略相当于$0 输出空白print“”。4、显示当前系统上。如果print后接选项没有逗号只有空格输出的结果连载一起{print $1 $7}
1、Awk 的变量分为内置变量和自定义变量
FS:Field Sperator输入时字段分隔符
#awk ‘BEGIN{FS=”:”}{print $1,$7}’ /etc/passwd
RS:Record Seperator 输入时的行分隔符也就是换行符
#awk ‘BEGIN{RS=”:”}{print $1,$7}’ /etc/passwd
OFS:output filed seperator 输出时字段分隔符
# awk ‘BEGIN{OFS=”:”}{print $1,$7}’/etc/passwd
ORS:OUTPUT ROW SERPERATOR 输出时行分隔符
#awk ‘BEGIN{ORS=”:”}{print $1,$7}’ /etc/passwd
    NF: NUMBER OF FIELD 字段数  
# awk 'BEGIN{FS=":"}{print NF $1,$7}' /etc/passwd
     NR:NUMBER OF RECORD 行数,所有文件一并计数
# awk ‘BEGIN{FS=”:”;OFS=”:”}{print NR,$1,$7}’ /etc/passwd
FNR: 多个文件时个文件分别计数
#awk ‘BEGIN{FS=”:”;OFS=”:”}{print FNR,$1,$7}’ /etc/passwd /etc/group
ARGV:数组保存命令本身这个字符。ARGC:保留awk参数的个数
#awk ‘BEGIN{print ARGV[0],ARGV[1] ARGC}’ /etc/passwd /etc/group
awk可自定义变量,其格式-v var_name = VALUE 在此变量名区分大小写。
#awk ‘BEGIN{a=”Hi awk”}{print a}’ /etc/group 在此/etc/group有多少行,就会输出多少行Hi awk,如果要输出一行则#awk ‘BEGIN{a=”Hi awk”}{print a}’还可以#awk -v a=”Hi awk” ‘BEGIN{print a}’
1.2、awk的printf命令使用要点:1)要指定format;2)不会自动换行,要换行需执行;3)format用于为后面的每个item指定其输出格式。而format格式的指示符都是以%开头,后跟一个字符;%c:显示字符ASCII;%d,%i:十进制整数;%e,%E:科学计数法显示数值;%f:显示浮点数;%g:%G以科学计数法格式或浮点数格式显示数值;%s:显示字符串;%u:显示无字符串;%%:显示%自身。
1.2.1、%后可接修饰符:#:表示显示宽度;-:左对齐;+:显示数值的符号。例如%-10s:表示10个字符的宽度并左对齐。
#awk -F: ‘{printf % “10s,%20s”,$1,$7}’ /etc/passwd,输出结果中间有逗号隔开当然也可以用空格隔开#awk -F: ‘{printf “%10s %20s”,$1,$7}’ /etc/passwd逗号换成空格即可。还可以使右边的左对齐#awk -F: ‘{printf % “10s %-20s”,$1,$7}’ /etc/passwd。下面看一下对浮点数的操作。
wKiom1R7PlDigzOqAABwLLOrd-A251.jpg
如上截图中第一行没有换行符,而二三行加入换行符,其效果一目了然,美观大方。最重要的是有保留有效位的功能。下面再来看一下%e和%f的使用。
wKioL1R7PtmhurkpAABoykK9xz4759.jpg
1.2.2、awk的操作符有算数操作符+,-,*,/,%,-x(负值),+x(转换为数值)。赋值操作符:=,+=,-=,/=,%=,^=或者**=,++,--。如果模式自身是=,要写成/=/。比较操作符:<,>,<=,>=,==,+=,!=,~:模式匹配,左边的字符串被右边的模式匹配为真,否则为假。~=:与上相反。逻辑操作符:&&,||。条件表达式:selector?if-true-expression:if-false-expression。函数调用function_name(argu1,argu2)。条件表达式应用如下。
wKiom1R7PlGSKrDKAAGa4OOIQrI510.jpg
     2、awk模式
2.1 Regrexp:格式为/PATTERN/,仅处理被/PATTERN/匹配到的行。如# awk -F: ‘/root/{print $0}’/etc/passwd
2.2 Espression:表达式,其结果为非0或为非空字符串时满足条件,仅处理满足条件的,例如:# awk -F: ‘{printf “%10s %-10d”,$1,$3}’ /etc/passwd。
2.3 Ranges:行范围,此前地址定界,startline,endline,仅处理行范围内的行。
2.4 BEGIN/END: 特殊模式,仅在awk命令的program运行之前之前(BEGIN)或运行之后(END)   
2.5 Empty:空模式,匹配任意行。
3、常用action:1)表达式,比如赋值表达式,2)还可以是控制语句,3)哈可以是组合语句,4)输入语句,5)输出语句(print、printf)。
4、控制语句详解
    4.1 if-else,格式 if(condition){then body} else{else body}例如:# awk -F: '{if($3>=500){print $1,"is a common user"}else{print $1,"is an admain or system user."}}' /etc/passwd。在看一例:找出/etc/inittab 中字段数大于等于8的行,# awk '{if (NF>=8) {print}}' /etc/inittab
4.2 while循环,格式:while(condtion){while body}条件为真进入循环。例如输出/etc/inittab下的奇数个字符的行# awk '{i=1;while(i<=NF){printf "%s ",$i;i+=2};print""}' /etc/inittab。
Length()函数:取字符串的长度。例如,取出/etc/inittab中字符数大于6的字符:# awk '{i=1;while (i<=NF){if (length($i)>=6){print $i};i++}}' /etc/inittab
4.3  for循环:其格式:for(variable assignment; condition;iteration process){for body},例 # awk '{for(i=1;i<=NF;i+=2){printf "%s ",$i};print ""}' /etc/inittab则是找出/etc/inittab下奇数字符串的行。再看使用for循环取出/etc/inittab中字符数大于6的字符:# awk '{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}' /etc/inittab
for循环可以用来遍历数组元素:语法格式for(i in array){for body}。下面是一个实例# awk 'BEGIN{for(i=1;i<=5;i++){array = i*2-1;}for(i in array){print i"="array}}'
4=7
5=9
1=1
2=3
3=5
并没有按顺序输出。
4.4 case语句,语法格式:switch(expression){case VALUE or /RGEEXP/:stateme1;...default: staemeN}
4.5 next 表示提前结束本行的处理而进入下一行的处理。例:# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd,表示不对满足条件的那一行处理。
5、数组,如果引用一个数组元素时,事先不存在,awk会自动创建元素并初始化为空串,因此要判断某数组是否存在某元素,使用index in array这种格式。如果要遍历数组中的每一个元素需要使用如下特殊结构。For (var in array){for body},其中
# netstat -tan | awk '/^tcp/{++state[$NF]}END{for (s in state){print s state}}'
    6、awk的内置函数,split(string,array[,fieldsep[,seps]])功能:将string表示的字符串以filedsep为分割符进行切片,并切片后的结果保存至array为名的数组中:例如:awk ‘BEGIN{split(“root:x:0:0”,user,”:”);for(i in user) print user}’
在其内部保存user[1]为root,user[2]为x,user[3]为0,user[4]为0。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-34233-1-1.html 上篇帖子: rsyslog日志管理 下篇帖子: Awstats 安装(nginx) 生成器
累计签到:73 天
连续签到:1 天
发表于 2019-1-28 09:00:19 | 显示全部楼层
真是太谢谢楼主了,这么慷慨地共享了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表