awk命令用法及编程


awk(gawk):报告生成器,格式化文本输出:awk,gawk基本用法:gawk [options] programFILE …program: PATTERN{ACTION STATEMENT};可以有多个,语句之间用分号分隔print,printf选项:-F:指明输入数据时用到的字段分隔符-v var=value:自定义变量;
变量:1)内建变量FS:input field seperator(输入字段分隔符,默认为空白字符)#awk -v FS=’:’ ‘{print $1}’ /etc/passwd#awk -F: ‘{print $1}’ /etc/passwd(这个命令和上面的命令效果是一样的)注:使用FS可以一次使用多个字符做为分隔符;例:awk -v FS=”[,:]” ‘{print $3,$1,$2}’ d.txtOFS:output field seperator(输出字段分隔符,默认为空白字符)#awk -v FS=’:’ -v OFS=’:’ ‘{print $1,$3,$7}’ /etc/passwdRS:input record seperator,输入时的换行符;ORS:output record seperator,输出时的换行符;NF:number of field,每一行字段数量{print NF},{print $NF}(在awk中引用变量不需要加$符号)一行中的最后一个字段用$NF表示NR:number of record,处理过的行数#awk ‘{print NR}’ /etc/fstabFNR:每一个文件处理过的行数#awk ‘{print FNR}’ /etc/fstab /etc/issueFILENAME:当前正在处理的文件的文件名#awk ‘{print FILENAME}’ /etc/fstabARGC:命令行参数的个数#awk ‘BEGIN{print ARGC}’ /etc/fstabARGV:数组,保存的是命令行所给定的各参数#awk ‘BEGIN{print ARGV[0]}’ /etc/fstab2)自定义变量-v var=value变量名区分字符大小写;#awk -v test=’Hello gawk’ ‘BEGIN{print test}’在program中直接定义#awk ‘BEGIN{test=”Hello gawk”;print test}’操作符: 算术运算操作符:x+y,x-y,x*y,x/y,x^y(次方),x%y-x+x:转换为数值字符串操作符:默认为没有符号的操作符:表示字符串连接赋值操作符:=,+=,-=,*=,/=,%=,^=比较操作符:>,>=,
模式匹配符:~:是否匹配!~:是否不匹配逻辑操作符:&&:与||:或!:非函数调用:function_name(argu1,argu2,…)条件表达式:selector?if-true-expression:if-false-expression#awk-F: ‘{$3>=1000?usertype=”Common User”:usertype=”SysadminUser”;printf “%15s:%-sn”,$1,usertype}’/etc/passwdprintf格式化输出:格式化输出的命令:printf FORMAT,item1,item2,…(1)FORMAT必须要给出(2)Printf不会自动换行,如果需要换行,需要显式给出换行控制符,n(3)FORMAT中需要分别为后面的每个item指定一个格式化符号格式符:%c:显示字符的ASCII码;%d,%i:显示十进制整数;%e,%E:科学计数法计数显示%f:显示为浮点数;%g,%G:以科学计数法或浮点形式显示数值;%s:显示字符串;%u:无符号整数;%%:显示%自身;修饰符:#[.#]:第一个数字用来控制显示的宽度:第二个#表示小数点后的精度,可以省略#awk -F: ‘{printf “Username:%20s UID:%dn”,$1,$3}’ /etc/passwd-:左对齐#awk -F: ‘{printf “Username:%-20s UID:%dn”,$1,$3}’ /etc/passwd+:显示数值的符号,负数显示为-,正数显示为+号#awk -F: ‘{printf “Username:%20s UID:%+dn”,$1,$3}’ /etc/passwd模式匹配:1)empty:空模式,匹配每一行;2)/regular expression/:仅处理能够被此处的模式匹配到的行#awk ‘/^#/{print}’ /etc/fstab #awk ‘!/^#/{print}’ /etc/fstab3)relational expression:关系表达式,结果有”真“有“假”:结果为”真“才会被处理:真:结果为非0值,非空字符串; #awk -F: ‘$3>=1000{print $1,$3}’ /etc/passwd#awk -F: ‘$3
#awk -F: ‘$NF==”免费云主机域名/bin/bash”{print $1,$NF}’ /etc/passwd#awk -F: ‘$NF~/bash$/{print $1,$NF}’ /etc/passwd4)line ranges:地址定界(行范围)#awk -F: ‘/^root/,/^liu/{print $1}’ /etc/passwd注意:不支持直接给出数字的格式#awk -F: ‘(NR>=2&&NR
5)BEGIN/END模式BEGIN{}:表示仅在开始处理文件中每一行文本之前执行一次的程序;END{};表示仅在文本处理完成之后,命令结束之前执行一次的程序;条件判断,循环: 条件判断:if(condition){statements}例:#awk -F: ‘{if($3>=1000) print $1,$3}’ /etc/passwdif(confition){statements} else {statements} 例:#awk -F: ‘{if($3>=1000) {printf “Commono user:%sn”,$1} else {printf “root orSysuser:%sn”,$1}}’ /etc/passwd 循环:while(condition) {statements}:条件为“真”,进入循环:条件为“假”,退出循环例:#awk -v i=1 ‘BEGIN{while(ifor(expr1;expr2;expr3) {statements}例:#awk ‘/^[[:space:]]*linux16/{for(i=1;ifor(var in array) {for-body}:常用于遍历数组中的元素例:#netstat -tan | awk ‘/^tcp>/{state[$NF]++}END{for(i in state) {print i,state[i]}}’#awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}’ /usr/logcal/nginx/logs/access.log跳出循环: break:跟出整个循环
continue:跳出当前循环,进入下一个循环 next:提前结束对本行的处理,直接进入下一行
例:#awk -F: ‘{if($3%2!=0) next;print $1,$3}’ /etc/passwd数组:关联数组是awk一个独特的特征,它的一个强大的功能就是可以使用字符串作为一个数据的下标Index-erpression:若某数组事先不存在,则在使用时直接创建,并将其初始化为空的数组;可使用任意字符串作为下标;字符串要使用双引号;若要判断数组中是否存在某元素,要使用”index in array“格式进行:若要遍历数组中的每个元素,要使用for循环; for(var in array) {for-body}注意:var会遍历array的每个索引;删除数组中的元:delete array[subscript]函数:awk的内置函数可以分为两组:算术函数和字符串函数1)内置函数数值处理:rand():返回0和1之间一个随机数;字符串处理;length([s]):返回指定字符串的长度sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;gub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其全部替换为s所表示的内容;split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中; #netstat -tan | awk ‘/^tcp>/{split($5,ip,”:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’ getline函数:
getline函数的作用是从文本中读取内容,也可以从管道中接收内容 getline函数的用法比较特殊,不能使用getline(),它的语法不允许有圆括号,只能使用getline
从文件中读取内容:getline 从文件a中读取内容,小于号表示重定向,不能理解为小于号 将读取的内容赋给一个变量:getline name “a”2)自定义函数练习:1.统计/etc/fstab文件中每个文件系统类型出现的次数;2.统计指定文件中每个单词出现的次数;3.统计下面语句中,每个单词及字符出现的个数the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentationand support ections for more infomation4.统计grade.txt中的分数的平均数 mona 70 77 85 83 70 89john 85 92 78 94 88 91andrea 89 90 85 94 90 95jasper 84 88 80 92 84 82dunce 64 80 60 60 61 62ellis 90 98 89 96 96 925.在问题4的基础上统计grade.txt中班级平均分数,并以A,B,C,D为同学平均分做出分类并统计? 6.文件test中有如下内容:zhangsan 80 lisi 81.5 wangwu 93 zhangsan 85lisi 88 wangwu 97 zhangsan 90 lisi 92 wangwu 88要求输出格式:(average:平均成绩,total:总成绩)name#######average#######totalzhangsan xxx xxx lisi xxx xxx wangwu xxx xxx答案:1.2.3.统计字符出现的次数统计单词出现的次数4.5.6.

相关推荐: linux如何查看内存多少g

这篇文章主要介绍“linux如何查看内存多少g”,在日常操作中,相信很多人在linux如何查看内存多少g问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux如何查看内存多少g”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/28 11:43
下一篇 01/28 11:43