已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
awk教程awk的基本功能是对文件进行指定规则浏览和抽取信息。基本格式:(1) awk -F 分隔域 command input-file(s)(2) 写入shell脚本中(3) awk -f awk-script-file input-file(s)注意:这里如果使用if等编程语句,要用括起来。testname grade score idhover 2 96 2003073twq 3 91 2003074zsm 4 92 2003075hzm 5 95 2003076bl 6 96 20030771,文本过滤处理:(1) awk print $0 test #打印文件的全部内容注意:这里awk使用函数print用来打印整个文件的内容。其中的$0就表示整个文件的内容。(2) awk print $1 test #抽取文件test中的第一列注意:如果awk没有使用-F指定分隔符号,默认的分隔符号是空格和TAB键。#列出所有的用户名和登陆的shell名awk -F : print $1,$6 /etc/passwd(3) awk -F : $1=root print $0 /etc/passwd指打印用户名为root的那一行2,文本格式定制(1)给输出信息加上表头awk -F : BEGIN print name shelln- print $!t$6 /etc/passwd(2)awk -F : BEGIN print name shelln- print $!t$6 END end-of-report /etc/passwd3,在awk中使用正则表达式 表示匹配行首的字符. 匹配正的任意一个字符(str1|str2) 匹配含有str1或str2的行 . 匹配任意一个字符(1)匹配为使一域匹配一正则表达式,可以使用以下两种方法: 1)$n正则表达式 2)if($n正则表示式) print $0awk -F: $0 /root/ /etc/passwd #打印以root开头的行awk -F: if($0 /root/) print $0 /etc/passwd #和上一句等效*精确匹配*#打印名字为root的用户在/etc/passwd文件中的记录awk -F : $1=root print $0 /etc/passwd#打印路径为/root的用户在/etc/passwd中的记录awk -F : $6=/root print $0 /etc/passwd4,在awk中使用条件操作符= 大于等于 yes else print $0 no filename*如何在awk中使用变量要注意的是在awk中的表达式一般是用号括起来的,在shell中单引号是全屏蔽符,所以用单引号使得变量无法生效,在使用shell变量时,可以这样使用#/bin/sh#name=zhengxhcount=awk -F: /$name/ #这里需要使用变量的地方把变量隔开 sum+=$3 END print sum *使用awk输出文件的倒数第N行tail -n $N $filename | awk if(NR=1) print $0*)如何在AWK中使用外部变量1)aa=aaaaaaaawk print $aa $filename2)以下使用外部变量时有错:#!/bin/bashfilepath=/etc/passwduser=rootresult=awk -F: /$user/ print $1 $filepathecho $result$改正:awk -F: /$user/print $1 $filepath*如何把AWK中的值,传送到外部的SHELL变量使用$() 或 aa=awk -F: print $0 $filename *进行统计文件aa.txt一个用户可能有多个记录,这时只统计一次:数据 用户ID 下载文件名称 用户所在地 等。20071128,0001,1,null,600571021800,028 20071128,0002,1,null,600571001800,02120071128,0002,1,null,600571001802,02120071128,0003,1,null,600571031800,02020071128,0004,1,null,600571001800,010统计各个的号码(最后一个字段)数量awk -F, if(!b$2$6)a$6+;b$2$6+ENDfor(i in a)print i,ai*如何把多个语句放在一句话(一行)中处理cat $file | awk ip=$1; i=index($0,google); if(i1)ua = substr($0,i); print ip t ua*把记录aa,bb,cc name, address, age变成记录ip,aa,bb,cc ip,name,address,ageawk -F, pirntf 192.168.5.154,$0 *取一个字符串的首字母str=abcecho $str:0:1echo $str|awk print substr($0,1,1)echo $str|sed s/(.).*/1/*如何在一字符串的前面加上字符串 addtextawk print addtext $0 temp*计算不重复的列的总和aa|001|23ac|001|23bb|002|213cc|004|32dd|005|34awk -F| !a$1+sum+=$3 ENDprint sum filename*定义多个分界符aa cc dd bb,ee ffawk -F , print $3 filename 有时候有可能出现多个分隔符号,但是我们需要把它当成一个,这时就要用:*#echo adf:adf:f | awk -F:+ print $2#adf*#echo adf:adf:f | awk -F: print $2# #输出空*如何用awk处理这样的文件格式?源文件格式: 表1313 客户经理业绩情况表(月报表)支局所名称:XXXX储蓄所 月份:10 客户经理业绩(累计日积数)酬金姓名 代号 活期 整整3月整整6月 整整1年 整整2年 整整3年整整5年 整整8年 零整1年 零整3年零整5年 定活两便 兰 37040576 0.00 0.00 0.000.00 0.00 0.00 0.000.00 0.00 0.00 21340.000.00 0.00 禚树征 37040585 27277.21 120.00 0.002965.22 0.00 0.00 0.000.00 0.00 0.00 0.000.00 845615151469035520.00秦 37040502 20094.30 0.00 0.000.00 0.00 0.00 0.000.00 0.00 0.00 0.000.00 622937933443235840.00 合 计 444868.41 0.00 0.002965.22 0.00 0.00 10764.200.00 0.00 0.00 0.0018600.00 13791245122257916000.00如何用awk处理成以下格式(只要里面的记录并用逗号分割每个字段,最后一个字段不要,表头和表尾不要):兰,37040576,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,21340.00,0.00 禚树征,37040585,27277.21,120.00,0.00,2965.22,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00秦,37040502,20094.30,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00awk sub( t, ,); print $0 tempawk sub( ,t, ,); print $0 temp*如何用TAB做分隔符号awk -Ftawk -F t #默认是这样,以空格或TAB做分隔符一般模式:awk -Frexp filename这里rexp是一个正则表达式,用来指示要使用的分隔符。*-在awk脚本中有下面一段BEGINsplit(123#456#789,team,#)ENDfor(i in team) print team预测的输出应该是123456789啊!为什么实际的输出是456789123呢?答:-while(+i in team) print teami-*-awk中使用system()answer:ls | awk if (system(ls $0) = 0) print file $0 exists !*-调用外部命令和awk结合使用getline得到外部命令的输入f ls | awk getline ll; print $ll-*-只输出第一行的内容awk print; exit*-多shell命令awk BEGINwhile(dir|sed 1,3!d|getline)print $1*-在awk的输出中加单引号#cat filerwxrwsrwx gprs 512 GPRSawk printf(%s %s %s %sn,$1,$2,$3,$4) file 在这里要理解的是:上面的表达式分成了三块,前面的内的内容是一块,中间的双引号内的内容是一块,最后的单引号里的内容是一块;由于单引号在双引号中的作用被屏蔽,所以输出的变量会带上单引号。从而达到预定结果。*-得到df -h 显示出来的百分数字(去掉百分号)(1)df -h | awk if(NR!=1) print $5 | cut -d% -f 1(2)df -h | awk -F t%+ if(NR!=1) print $5*实现加和中间结果如下所示:CPU usr sys idl0 13 4 761 9 4 79要想显示下列结果:1 22 8 155*cat data | awk if(NR!=1) a+=$1;b+=$2;c+=$3 ENDprint a,b,c,d,e*如何实现以几个字母中任意一个打头的字符串的查找cat dataMike Harrington:(510) 548-1278:250:100:175Christian Dobbins:(408) 538-2358:155:90:201Susan Dalsass:(206) 654-6279:250:60:50Archie McNichol:(206) 548-1348:250:100:175Jody Savage:(206) 548-1278:15:188:150Guy Quigley:(916) 343-6410:250:100:175Dan Savage:(406) 298-7744:450:300:275Nancy McNeil:(206) 548-1278:250:80:75John Goldenrod:(916) 348-4278:250:100:175Chet Main:(510) 548-5258:50:95:135Tom Savage:(408) 926-3456:250:168:200Elizabeth Stachelin:(916) 440-1763:175:75:300awk -F : $1/MJ print $1输出以D开头的域awk -F: for(i=1;i=0;i-) print aNR-i;for(j=1;j=0;i-) print a(NR-i)%4;for(j=1;j=2) print i,ai file分析: 由以上的命令可以得到流程:aa 2ab 1ac 1ad 1ae 1aac 1而for(i in a) 则是要遍历的i的值是:a,b,c,d,e,ac*)去掉重复的行awk !a$0+ file*)去掉重复行,并保持顺序不变awk f$0!=1print;f$0=1 *)打印重复行1)awk a$0+ ENDfor(i in a) if(ai1)print i filename2)sort cc | uniq -dc*)如何匹配多个模式1)awk /p1|p2/ file2)awk /zhengxh| file*)设定字段分隔符1)awk -F: OFS=-print $1,$2,$3 file*)范围查找1)awk -F: /200805012-9/ file*)数字计算求和 file:hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98punches QTY: 7 PRICE: 3.59 TOTAL: 25.13drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18bits QTY: 55 PRICE: 1.19 TOTAL: 65.45saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77nails QTY: 800 PRICE: .19 TOTAL: 152screws QTY: 80 PRICE: .29 TOTAL: 23.2brads QTY: 100 PRICE: .24 TOTAL: 241)awk x=x+$2 file*)-3 0.0229136429687275412 0.0227060073074851042 0.504447673546501663 0.0221282996127394476 0.0254684400602522081 0.022856042968727539第一列相同则第二列对应值求和。输出$1,sum-1)awk a$1=+$2; b2$1+ ENDfor(i in a) if(b2i1) print i,ai file*)我以如下字符要处理a 123b 124c 125a 126d 127e 128ac 129如果第一列出现 两次或两次以上 将其打印出来,并计算出现次数。1)awk a$1+ ENDfor(i in a) print i,ai file-*)awk中如何显示大数据1)awk printf%.fn, NR + 1211439408282 filename*)awk使用外部变量1)awk if($3=$a) print $1,$2,$b,$4 text2)awk if($3=$a) print $1,$2,$b,$4 text*)文件内容:74683 100174683 100274683 101174684 100074684 100174684 100274685 100174685 101174686 1000.100085 1000100085 1001文件就两列,希望处理成74683 1001 1002 101174684 1000 1001 1002.就是只要第一列数字相同, 就把他们的第二列放一行上,中间空格分开-1) awk a$1=sprintf(%s %s, a$1,$2) ENDfor(i in a) print i,ai file2) awk a$1=a$1 $2 ENDfor(i in a)print i,ai data13*)76523 1001 100276524 1002 100376526 1000 100376528 1000.100025 1000 1025请教下, 文件第一列已按大小排序, 现在想按第一列的顺序, 把没有出现的行数补上实现76523 1001 100276524 1002 10037652576526 1000 10037652776528 1000.100025 1000 1025怎样能够直接补上这些缺失的行-1)?*)每个字段形如 ,如何高效的提取value=*中间的* 望各位不吝赐教-1) grep -o value=.* data7 | awk -F print $22) sed s/.*value=(.*).*/1/ file*)-两个文件ab#cat aa1 b=1 num=3 c=2a3 b=1 num=3 c=3bc f=3 num =2 f=3fa f=4 num=2 f=6#cat ba4 b=1 num=6 c=3a1 b=1 num=5 c=2bc f=3 num =1 f=3fb f=4 num=3 f=6要求对比两个文件条件1:如果文件a中有和文件b第1,2,4部分都相同的行则用文件b中该行的第三部分num=x其x的值减去文件a中该行第三部分num=x其x的值,并将结果连同该行的其他部分写入文件c例如:文件b中第二行a1 b=1 num=5 c=2的第一部分:a1,第二部分b=1,第4部分c=2和文件a的第一行a1 b=1 num=3c=2相应部分相同则将结果a1 b=1 num=2 c=2 写入文件c(num=2是文件b的num=5减去文件a的num=3的得来的)条件2:如果条件1中num后数值相减后该结果为负值则将文件b中的该行直接写入文件c例如:b中的第三行bc f=3 num =1 f=3与文件a中的第三行bc f=3 num =2f=3的1,2,4部分相同,但是num后数值的运算结果为-1(1减2得来的)所以直接将文件b中的该行bc f=3 num =1 f=3直接计入文件c条件3:如果文件a中没有找到和文件b中1,2,4部分相同的行则将文件b中的该行直接写入文件c例如:文件b的第四行fb f=4 num=3f=6,在文件a中无法找到和他第1,2,4部分相同的行所以直接将该行写入文件写入文件c条件4:a或者b本文本身中不会出现第1,2,4部分相同的行-test.awk#!/bin/awk -fNR=FNR sub(/.*=/ , ,$3) h$1$2$4 = $3NRFNR i = 0 sub(/.*=/, ,$3) if($1$2$4 in h) i = $3 - h$1$2$4 if(i0) $3 = num=i else $3 = num=$3 printawk -f test.awk a b c*)awk对文件进行分流$cat file:00:49:42.0257912008-05-31 09:41:2-00:00:34.9742092008-05-31 10:31:4.目的是把以00开头的行输出到一个文件,-00开头的行输出到一个文件,用一条awk语句可以实现么?*)如何在文件中使用awk设定的变量参考: #awk -v min=43922 -v max=52059 a$1ENDfor(i=min;i=max;i+)if(!(i in a)print i*)3 0.0229136429687275412 0.0227060073074851042 0.504447673546501663 0.0221282996127394476 0.0254684400602522081 0.022856042968727539。第一列相同则第二列对应值求和。输出$1,sum这样的是错误的!#awk a$1+=$2; ENDfor(i in a) print i,ai cata3right : awk a$1+=$2 ENDfor(i in a) print i,ai cata3*)有一个类似于这样的文本:16 001agdcdafasd16 002agdcxxxxxx23 001adfadfahoh23 001fsdadggggg我想要得到16 00116 00223 00123 002在awk中,就是取$2的前三个字符,但是不知道如何处理大家帮帮忙哦,先谢谢了:)-1)awk print $1,substr($2,1,3)2)sed s/(.* .).*/1/ file 3)grep -o .+ +. file *)把文件 fileCHN0401部门1组分部门查询吴斌CHN0402部门2组查询李演CHN0403部门3组查询李路变为-CHN0401 部门1组 分部门查询 吴斌CHN0402 部门2组 查询 李演CHN0403 部门3组 查询 李路1)awk /CHN/h=$1; sub(n,h); printf %s ,h; for(i=0; i=3; i+) if(getline var) sub(n,var); var=sprintf(%s , var); printf %s,var; print ; file2) $cat ff.awk #!/bin/awk -f#/CHN/ h=$1; sub(n,h); printf %s ,h; for(i=0; i=3; i+) if(getline var) sub(n,var); var=sprintf(%s , var); printf %s,var; print ; file$ff.awk filename或#!/bin/awk -f#/CHN/ s=$0; for(i=0; i=3; i+) getline s=sprintf(%s %s, s,$0); printf %s, s; print ; file*替换特定行之间的行*) 替换注释行 !- - !- - !-!- - 1)awk BEGINRS=NR%2 urfile*)使用多个单词作为分隔符awk -Fword1|word2 print $3*) 把不同的结果定向到不同的文件中去有这样个文件123|0|444123|1.00|444588|222|333现在想把第2个字段为0的取出来输出到一个文件,并删除该记录,用awk如何实现,谢谢代码如下:-zhengxhhoverzg stdshell$ cat dd123|0|444123|1.00|444588|222|333#注意在输出的文件名前面要加双引号zhengxhhoverzg stdshell$ awk -F| if($2=0)print file1; else print file2 ddzhengxhhoverzg stdshell$ cat file1123|0|444zhengxhhoverzg stdshell$ cat file2123|1.00|444588|222|333-*)比如解析下面一行:123|name|address|age我想以“|”为分割符,这样各个域为“123”, “name”,“age”1)awk -F|+ print $1 filename*)单引号的输出1) awk BEG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年云计算数据中心安全报告及未来五至十年数字基础设施报告
- 社区六一儿童节活动总结13篇
- 26年基础护理技能全需求发展课件
- 26年孤独感缓解护理课件
- 山东省枣庄市2026年高三八月模拟化学试题含解析
- 2026年定制模具加工生产合同二篇
- 肾移植术后BK病毒感染的发生发展机制及影响因素探究
- 肾炎灵胶囊剂工艺学深度剖析与优化策略研究
- 肺表面活性物质:呼吸机相关肺损伤防治的关键靶点探究
- 肺癌患者血浆纤维蛋白原和D - 二聚体变化及介入治疗影响的深度剖析
- 2024年深业集团招聘笔试参考题库含答案解析
- 学堂课程在线自我认知与情绪管理(哈工)期末考试答案(客观题)
- 宝钢BQB 481-2023全工艺冷轧中频无取向电工钢带文件
- 郑州市嵩山古建筑群总体保护规划
- 撤销冒名登记备案申请书
- 文档:重庆谈判
- 危重病人抢救评分标准
- 交际俄语口语智慧树知到答案章节测试2023年青岛城市学院
- 中国缺血性卒中和短暂性脑缺血发作二级预防指南(2022年版)解读
- YB/T 5051-1997硅钙合金
- GB/T 25745-2010铸造铝合金热处理
评论
0/150
提交评论