12月22, 2011

linux下的正则表达式表现形式及好用工具sed与awk

每次学新的一门编程语言,或者学习什么工具之类的时候,总是会有一章的内容在介绍正则表达式。

所以正则的基础就不详细介绍了(表示字符范围的转义通配符,闭包及正闭包区间,分组模式等等),只是介绍一些正则在linux下的特殊扩展形式吧。

还有就是接受正则形式的模式串的各种工具,比如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} 限定匹配次数范围

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 NR13

当然sed和awk还有许多东东可以继续深入学习,,但是日常工作掌握这些就差不多了,其他的就在工作中学习吧!

本文链接:https://75team.com/post/linux下的正则表达式表现形式及好用工具sed与awk.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。