免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1431 | 回复: 0
打印 上一主题 下一主题

sed&awk学习总结2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-11 15:34 |只看该作者 |倒序浏览
三、awk总体认识:   
1)awk 其实是一种编程语言--可以叫作样式扫描和处理语言,它支持用户自定义变量,函数及执行控制,动态正则表达式等先进功能,是一强大编程工具
  awk所做的工作类似数据库SQL语言,不同的是awk处理的是具有某些书写格式的文本,而数据库语言处理的则具备一定逻辑意义的字段组成的记录。  

2)调用格式:
  awk [ -F re] [parameter...] ['pattern {action}'] [-f progfile][in_file...]
说明:
  *语义:awk先按照-F 后面的分割符把in_file分割为多列,然后逐行进行pattern匹配,如果匹配成功则执行action或者-f后面的awk脚本
  *-F re:允许awk更改其字段分隔符,默认空格分开
  *parameter: 该参数帮助为不同的变量赋值
  *pattern参数可以是任何条件语句或复合语句或正则表达式
  *action参数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔
  *-f progfile:允许awk调用并执行文件名为progfile的awk语言文件。
  *in_file awk需要处理的原始文件
  *awk也使用"#"作为注释符
  
四、awk常用语法:
1)支持--自定义变量      #和C语言书写风格类似
   total=0
   
2)支持--自定义函数     
  function 函数名(参数表){
   函数体
  }
3)支持-条件控制流程
   if () else if () else {}  #和C语言书写风格类似
   
4)支持-循环控制流程
   while、do-while和for   #和C语言书写风格类似
     
5)awk内置变量
  *在awk程序中引用内置变量不需要使用标志符"$"
  几个常用的内置变量:
   NF 当前记录中的字段个数
   NR 已经读出的记录数
   FNR 当前记录数
   FS 输入字段分隔符 空格
   
6)awk内置函数
   常用的几个内置函数:
   printf(format,variable)   #格式化输出,按format提供的格式输出变量variable。
   gsub(reg,string,target)   #每次常规表达式reg匹配时替换target中的string
   index(search,string)    #返回string中search串的位置
   length(string)      #求串string中的字符个数
   match(string,reg)     #返回常规表达式reg匹配的string中的位置   
   split(string,store,delim)   #根据分界符delim,分解string为store的数组元素
   
7)特殊语句:
  awk的next语句导致awk读取下一个记录并完成模式匹配,然后立即执行相应的操作
  awk的 getline语句用于简单地读取一条记录
  awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句
  awk中允许用printf和管道将结果输出到一个文件/命令
  BEGIN:任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行
  END:END之后列出的操作将在扫描完全部的输入之后执行
   
8)awk与shell script混合编程:
  awk读取Shell script程序变量,通过"'$变量名'"的方式读取sell scrpit程序中的变量
  将shell命令的执行结果送给awk处理,通过管道线(|)传递给awk处理
  shell script程序读awk的执行结果,变量名=`awk语句`,也可以用管道的方法将awk执行结果传递给shell script程序处理
  在awk中执行shell命令行----嵌入函数system()
   
awk的语法和C语言的语法在一定程度上有点类似,这也节省了记忆的时间。

9)常用用法举例:
  #每行后面增加一行空行   awk '1;{print ""}' ./test
  #给非空白行的行加上编号   awk 'NF{$0=++a " :" $0};{print}' ./test
  #计算行数 (模拟 "wc -l")  awk 'END{print NR}' ./test 或 awk '{i++}END{print i}' 或 sed -n '$=' ./test
  #计算每行每个区域之和   awk '{s=0; for (i=1; i
  
学习资料:
GNU awk:
http://www.gnu.org/manual/gawk/gawk.html
AWK单行脚本快速参考:
http://ximix.org/translation/awk1line_zh-CN.txt
经典书籍《sed & awk》

五、sed & awk的比较:
0)sed只是一个小工具,而awk则相当于是一门语言,两者的复杂性不可以比。
1)sed & awk都不修改原输入文件内容
2)grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法就点不同
3)awk支持对记录和字段的处理,而grep/sed只能对行进行处理。
4)如果是按行操作,就统统都用 sed;如果是不仅按行,还要按列操作,就统统都用 awk
5)awk对正则表达式支持的程度比sed要差些,文本处理方面perl相当于awk/sed/grep的一个高度概括。
6)其他待补充
六、cut命令:
利用cut命令也可以达到awk的获取特定格式文件中的特定列或字段的简单功能
命令用法:
cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delim][-s][file ...]
  *上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
     *list表示-b、-c、-f操作范围,n表示只有第n项,n-表示从第n开始到行尾,n-m表示从第n项到第m项,-m表示从行开始到第m项。
     *file表示的自然是要操作的文本文件的名称;
     *delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
     *-s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
举例:
比如:将系统所有用户名保存到特定的文件,可以用:cut -d: -f 1 /etc/passwd > /tmp/users

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/70075/showart_2118020.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP