当前位置: 首页 > Linux

三剑客AWK

时间:2023-04-06 02:11:35 Linux

的博客参考http://www.178linux.com/6553http://baike.baidu.com/link?url=Y4lo-kWxygpw7NLaKTSehvpkAM7ogKA6GPVxaM23MMSzjmfsx4o3mey7-VVqu1pDhZJqa0sr7cJNhggIHC5JT_AWK是一款基于pattern扫描和处理的工具介绍aw_AWKgrep的搜索和sed的编辑,在分析数据和生成报告方面尤为强大。awk逐行遍历一个或多个文件,找到与模式匹配的行,然后用指定的分隔符(默认为空格)对其进行切片,然后对切片后的数据进行处理和分析。事实上,gawk有自己的语言,它本身就相当于一个解释器,允许用户创建短程序来读取输入文件,对输入数据进行排序、计算、报告生成等操作,甚至可以实现循环、数组等操作、条件判断、函数、变量等功能,进而完成更复杂的数据分析和处理任务。awk的使用方法1、命令行:awk[-Ffield-separator]'COMMAND'inputfiles//其中COMMAND是awk的执行命令,用来处理数据,[-Ffield-separator]是可选选项,inputfiles是一个挂起的文件。//在awk的使用中,将需要处理的文件逐行使用分隔符分成若干个域,称为域。分隔符默认为空格。您可以使用-F选项指定分隔符。2、shell脚本模式需要将执行的awk命令插入到awk脚本文件中,然后在第一行设置命令解释器为#!/bin/awk,通过输入脚本名来调用。3.所有awk命令都写到一个单独的文件中。处理同类型文件需求时,使用awk-fawk-scriptinputfiles调用,其中awk-script指的是awk脚本。awk的基本用法awk[OPTIONS]'program'FILE1FILE2...program:PATTERN{ACTIONSTATEMENT}program:编程语言PATTERN:modeACTIONSTATEMENT:动作语句,可以由多条语句组成,以分号隔开;如:print,printfOPTIONS:-F[]:指定输入字段分隔符-vVAR_NAME=VALUE:变量赋值-f/PATH/FROM/AWK_SCRIPT指定脚本文件awk处理文本一行读取,切片根据输入的分隔符(默认为空格符),切出n片,然后将每片赋值给awk内部的一个变量进行存储。流程变量名是$1、$2、$3……直到最后一个,最后这些切片就可以单独处理了。print输出命令输出默认分隔符:空白字符之间用逗号分隔print""输出空白字符print$0输出整行awk[options]'BEGIN{action}pattern{action}END{action}'fileawk语法构成:BEGINstatementBlock,可以使用模式匹配的通用语句块。awk执行END语句块时,用分隔符$1、$2、$n分隔的域(域)标记为域标识,$0为所有域。文件的每一行调用记录遗漏Action默认执行print$0操作pattern模式action动作;行为行列行,记录记录字段列,域,字段示例[root@mm~]#echo-e"hello,world\nhelloworld">1.sh基本输出[root@mm~]#awk'{print$1}'1.sh引号函数[root@mm~]#awk'{print"hi",$1}'1.sh[root@mm~]#awk'{print"hi:$1"}'1.sh[root@mm~]#awk'{print"hi:$1",666}'1.sh空白输出[root@mm~]#awk'{print}'1.sh[root@mm~]#awk'{print""}'1.shawk默认是从键盘输入的,不管输入什么,输出的都是hello变量内置变量:FS:输出字段分隔符,默认为空RS:输入时的行分隔符,默认换行符OFS:输出时的字段分隔符,默认空白字符ORS:输出时的行分隔符,默认换行符NFprintNF:当前行的字段数print$NF:显示第一行当前行NF字段的值NR:行数;命令后面的所有文件统一计算FNR:行数;单个文件统计FILENAME:awk当前读取的文件名ARGC:awk命令行参数个数ARGV:array,保存命令行参数本身的自定义变量:awk-F:'END{printNF}'/etc/passwd#表示有7段分隔:(显示总字段)awk-F:'{print$(NF-1)}'/etc/passwd#取出awk-F的最后一个字段:'{printNR,$1}'/etc/passwd#显示行号awk'{printNR,$0}'/etc/issue/etc/fstab#合并两个文件显示行号awk'{printFNR,$0}'/etc/issue/etc/fstab#两个文件分别显示行号awk'{printFNR,$0,FILENAME}'/etc/issue/etc/fstabshowfilename(FILENAME)awk'BEGIN{printARGC}'/etc/issue/etc/fstab/etc/passwd#Display参数个数(BEGIN只显示一个参数)awk'BEGIN{printARGC,ARGV[2]}'/etc/issue/etc/fstab/etc/passwd#根据参数个数(index)取出文件Name([0]下标为awk)awk'BEGIN{printARGC,ARGV[ARGC-2]}'/etc/issue/etc/fstab/etc/passwd#参数倒序显示awk'{sex="male";printsex}'/etc/passwd#打印变量自定义sexawk'END{sex="male";printsex}'/etc/passwd#打印最后一个sexawk'{sex="male";age=20;printsex,age}'/etc/passwd#使用前必须先定义,否则不会定义第一个[root@mm~]#awk-F,'{print$1}'1.sh[root@mm~]#awk-vFS=',''{print$1}'1.sh[root@mm~]#awk-vFS=',''{print$1,$2}'1.sh[root@mm~]#awk-vFS=','-vOFS='&''{print$1,$2}'1.sh[root@mm~]#awk-vRS='''{print$1}'1.sh[root@mm~]#awk-vRS=''-vORS='-''{print}'1.sh[root@mm~]#awk'{printNF}'1.sh[root@mm~]#awk'{print$NF}'1.sh[root@mm~]#awk'{printNR}'1.sh2.sh[root@mm~]#awk'{printFNR}'1.sh2.sh[root@mm~]#awk'{printFILENAME}'1.sh[root@mm~]#awk'{printARGC}'1.sh[root@mm~]#awk'{printARGV[0]}'1.sh[root@mm~]#awk'{printARGV[1]}'1.sh[root@mm~]#awk-vhi="hibro"'{printhi}'1.sh[root@mm~]#awk'{hi="hibro";printhi}'1.shprintf输出命令%c:显示字符ASCLL码%d,%i:十进制整数%e,%E:科学计数法显示值%f:浮点数%g,%G:科学计数法或浮点数格式显示值%s:字符串%u:无符号整数%%:%符合自己的大小写[root@mmgrub.d]#cat/etc/issueUser:Centos,UID:6User:Kernel,UID:0User:,UID:0User:CentOSrelease6.6(Final)User:Kernel\ronan\mUser:awk-F:'{printf"User:%s\n",$1}'/etc/issueUser:%s\n表示将后面$1的内容显示为字符串,并在其前面添加User:字符串,最后添加换行符awk-F'''{printf"User:%s,UID:%d\n",$1,$3}'/etc/issueUser:%s,UID:%d\n表示以字符串的形式显示后面$1的内容,显示后面$2的内容以十进制表示,同时在末尾加一个换行符awk-F'''{printf"User:%-15s,UID:%15d\n",$1,$3}'/etc/issueissue左列显示15个字符左对齐,右列对齐默认方法是右对齐显示15个字符的长度[root@mm~]#awk-F,'{printf"第一条记录:%s\n",$1}'1.sh三元表达式{条件是满足和条件不满足?满意执行命令:不满意执行命令;print%15isaplaceholder($1)%-sisaplaceholder(usertype)n(newline):(冒号分隔符)}awk-F:'{printf"%s",$1}'/etc/passwd#%s占位符,在%s之后添加/n换行符awk-F:'{printf"%s%4.2f\n",$1,$3}'/etc/passwd#%s是$1占位符;%4.2f指2位小数,$3占位符awk-F:'{printf"username:%-30suid:%10d\n",$1,$3}'/etc/passwd#username(display):(separator)%-30s(%s是$1和左对齐-30个字符的占位符)uid(显示):%10d(%d是$310右对齐的占位符)\n(换行)",$1,$3运算符a.算术运算符-x:负值+x:转为数值b.字符运算符c.赋值运算符=,+=,-=,*=,/=,%=,^=,++,--d.比较运算符>,>=,<,<=,==,!=awk-F:'!($3>=50){print$3}'/etc/passwde.Patternmatchingwithoperator~:是否可以匹配bythepatternspecifiedontheright~!:是否不能被右边指定的模式匹配f.逻辑运算符&&:AND运算awk-F:'$3>=0&&$3<=1000{print$1}'/etc/passwd||:OR操作g.条件表达式awk-F:'{$3>=500?usertype="CommonUser":usertype="SysadminorSysuser";printf"%15s:%-s\n",$1,usertype}'/etc/passwdh。函数调用case[root@mm~]#awk-F:'$3>=0&&$3<=1000{print$1}'/etc/passwd[root@mmgrub.d]#awk-F:'!($3>=50){print$3}'/etc/passwd[root@mmgrub.d]#awk-F:'BEGIN{print"用户名uid\n------------"}{print$1,$3}END{print"=========="}'/etc/passwdPATTERNpattern1)empty:空模式,匹配所有行2)/RegularExpression/:只应用ACTION到正则表达式可以匹配的行awk-F:'/^[ab]/{print$1,$3}'/etc/passwd3)relationalexpression:关系表达式,结果不为0或者为非空字符串为真,否则为假;awk-F:'$3>=500{print$1,$3}'/etc/passwdawk-F:'$1~/root/{print$1,$3}'/etc/passwd4)lineranges:linerange5)BEGIN/ENDBEGIN:格式化前,用于输出表头或做预处理操作END:格式化后,用于输出表尾或做清理操作常用案例ACTION1)EXPRESSIONS:变量赋值2)控制Statements:controlStatement3)CompoundStatements:复合语句4)输入语句5)输出语句Controlstatement第一次使用:1)if-elseawk-F:'{if($3>=500)print$1,$3}'/etc/passwd[root@mm~]#awk'{if(NF>=6)printNF,$0}'/etc/passwd[root@mm~]#awk'{if(NF>=6)printNF,$0}'/etc/passwd[root@mm~]#awk-F:'{if($3>=500){print$1,"是一个commonuser"}else{print$1,"isasysadminorsysuser"}}'/etc/passwd2)whileloopawk'{i=1;while(i<=NF){if(length($i)>=6){print$i};i++}}'/etc/passwd3)do-while循环4)for循环awk'{for(i=1;i<=NF;i++){if(length($i)>=6)print$i}}'/etc/issue第二种用法:5)swtich6)breakandcontinue7)next:提前结束本行的处理;提前进入下游处理操作awk-F:'{if($3%2==0)next;print$1,$3}'/etc/passwdarrayassociativearrayindex-expression:任意字符数组都可以用来遍历函数1)内置函数取值处理:rand():返回0到1之间的一个随机数字符串处理:length([s]):返回指定字符串的长度sub(r,s[,t]):gsub(r,s[,t]):split(s,a[,r]):2)自定义函数凭经验统计指定web访问日志中每个ip的资源访问次数awk'{ip[$1]++}END{for(iinip)printi,ip[i]}'/var/log/httpd/access_log统计当前系统所有tcp连接的各种状态数ss-tan|awk'!/^State/{state[$1]++}END{for(iinstate)printi,state[i]}'