Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115704
  • 博文数量: 22
  • 博客积分: 835
  • 博客等级: 准尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 21:23
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(21)

我的朋友

分类: LINUX

2009-12-11 15:34:17

三、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<=NF; i++) s=s+$i; print s}' ./test
  #计算所有行所有区域的总和  awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}' ./test
  #删除每行前的空白并左对齐  awk '{sub(/^[ \t]+/, "")};1' ./test
  #删除每行结尾的空白    awk '{sub(/[ \t]+$/, "")};1' ./test
  #每行用 "bar" 查找替换 "foo" awk '{gsub(/foo/,"bar")}; 1'  ./test
  #调换前两列的位置    awk '{temp = $1; $1 = $2; $2 = temp}' ./test
  #打印文件的前十行=head   awk 'NR < 11' ./test
  #打印文件的后十行=tail   awk '{A[NR]=$0}END{for(i=NR-9;i<=NR;i++)print A[i]}' 或 sed -e :a -e '$q;N;11,$D;ba' 
  #打印匹配正则表达式的行=grep  awk '/regex/' ./test
  #打印不匹配正则表达式的行=grep -v awk '!/regex/' ./test
  #打印第5列等于"abc123"的行  awk '$5 == "abc123"' ./test
  #删除所有空白行     awk NF 或 awk '/./' ./test
  #删除重复连续的行    awk 'a !~ $0; {a=$0}' ./test
  
学习资料:
 GNU awk:
 AWK单行脚本快速参考:
 经典书籍《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
阅读(1175) | 评论(0) | 转发(0) |
0

上一篇:sed&awk学习总结1

下一篇:sed&awk学习总结3

给主人留下些什么吧!~~