注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

awk与sed的区别  

2014-10-07 21:20:57|  分类: linux工具命令 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
sed是以行为单位进行操作,增删查改,而awk的操作粒度则是列。
0) 回顾linux下两把正则牛刀sed与awk
**********************************************

正则,表示字符范围的转义通配符,闭包及正闭包区间,分组模式等等。linux下的两把正则牛刀:sed 和 awk。

1)语系对正则表达式的影响
       在linux下执行正则表达式,要考虑语系环境所带来的影响,LANG=C和LANG=zh_CN.gb2312时,[a-z]所选取的范围是不同的。

LANG=C,使用ascii编码,a-z表示的就是a-z,字母排列方式是A,B,C,D……Z 然后a,b,c,d……z
LANG=zh_CN.gb2312,使用的是gb2312语系,排列方式为: a,A,b,B,c,C……z,Z

2) 正则的基本语法
         在linux的常用工具如grep,sed,awk中,基础的正则表达式并没有正闭包+(可以用cc*来等价c+),另外也没有d,w,s等转义符,拥有的正则表达式字符为:
^ 匹配行首
$ 行尾
. 任意字符
转义字符,如查找单引号开头的行 grep ^’
* 闭包区间
[] 字符集合
[c1-c2] 字符区间 (和语系变量LANG有关)
[^] 字符集合之外
{n,m} 限定匹配次数范围

比如,使用“sed -i '/^$/d'  file_name”命令就可以直接将file_name中的空行。

3) 正则扩展语法
在linux的常用工具中,也提供了一些扩展的正则语法,如grep在执行时加上-E参数,,即可支持这些扩展语法:
+ 正闭包,c+等价cc*
? 0或1次匹配,等价{0,1}
| 或运算符,,(注意优先级低于连续和括号)
() 组运算符,用于为或运算符|提供连续的 字符组,优先级高于连续

4) 特殊符号
前面说语系对字符范围[]是有影响的,所以为了避免影响,linux下为正则表达式制订了一些特殊符号,可以表示字符范围,如下:
[:alnum:] 0-9 A-Z a-z 同w
[:alpha:] A-Z a-z
[:blank:] 空格和tab
[:cntrl:] 代表控制按键,入CR LF tab del等
[:digit:] 0-9
[:graph:] 空格和tab之外
[:lower:] a-z
[:upper:] A-Z
[:space:] 任何会产生空白的字符 空格 tab CR

重要的记住[:alnum:] [:alpha:] [:upper:] [:lower:] [:digit:]即可。

5) grep命令
grep可以搜索标准输入或文件中符合条件的行:
   
grep -A -B -n -E 'search-pattern' filename

-A表示匹配的行之后的几行
-B表示皮的的行之前的几行
-n表示显示行号
-E表示可以使用扩展正则表达式符号

6)sed
sed可以将标准输入的数据按行进行替换,删除,新增,选取等功能。

常用的option有:
-r 支持扩展正则语法
-E 支持扩展正则语法(mac下的tty)
-n 安静模式
-f 读取一个文件作为脚本
-e 进入环境模式
-i 直接修改文件内容,危险操作

另外sed的动作有:

d 删除 ’2d’ ’2,5d’ ’2,$d’
a 添加 ’2a hello world’
p 打印 ’2,5p’ ’2,$p’ 注意加-n 进入安静模式,只打印选取的部分
c 替换 ’2,5c hello’
s 部分数据的查找和替换 ‘s/aa/bb/g’ 可以加-n开启扩展正则模式

在cut -d ‘ ‘ -fn之前,我一般都会sed ‘s/ */ /g’把多个空格都替换为一个空格,然后再cut。

ll | sed 's/  */ /g' | cut -d ' ' -f9 #用空格cut前先用sed把多个空格转为一个
ll | awk '{print }' #学会awk就简单了,因为FS包含了单空格,多空格和tab,让分列更加智能

6) awk

sed是以行为单位进行操作,增删查改,而awk的操作粒度则是列。
awk是逐行处理数据的,NR表示当前处理的行,NF表示field的总数,FS则表示列分隔符号。

如: 
last|awk NR 13
1) 看linux下两个正则工具AWK与sed的不同
****************************************************

awk是一种程序语言,对文档资料的处理具有很强的功能。awk擅长从格式化报文或从一个大的文本文件中抽取数据。
awk的命令格式为:    awk [-F filed-separator] “commands” input-file(s)  
             每一个命令(commands)都由两部分组成:一个模式(pattern)和一个相应的动作(action)
    /pattern1/{action1}  
    /pattern2/{action2}  
    /pattern3/{action3}  
              awk将一行文字按分隔符(filed-separator)分为多个域,依次记为$ 1,$ 2 . . . $ n。$0代表所有域值。因此awk更适合于以域为单位来处理文件。加之ARGIND等内置变量,使awk能处理多个文件。典型的应用为查找一个文件中的某个字段是否在另一个文件中出现。例子见我的另一篇博客【awk】诡异的错误,linux和windows换行的区别。但由于$0代表所有域,即整行,因此awk也有简单行处理能力。

          sed 是一个精简的、非交互式的编辑器。它能执行与编辑vi和emacs相同的编辑任务,但sed编辑器不提供交互使用方式,只能在命令行下输入编辑命令。
           sed的命令格式为:
                   sed [options] 'command' file(s)  
                   sed [options] -f scrīptfile file(s)  
            作为编辑器,当然少不了插入(a/、i/)、删除(d)、查找替换(s)等命令。详见sed命令详解 。

总之:

    如果文件是格式化的,即由分隔符分为多个域的,优先使用awk;
    awk适合按列(域)操作,sed适合按行操作;
    awk适合对文件的抽取整理,sed适合对文件的编辑。
  评论这张
 
阅读(117)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017