正则表达式、sed、awk

来源:互联网 发布:某交友社区2千万数据 编辑:程序博客网 时间:2024/04/30 02:32

 

awk:通配符.*

 

1.正则表达式

首先,必须知道命令是否支持正则表达式,不然的话只能使用bash的通配符。

然后,一定要分清楚通配符和正则的区别:

通配符*表示任意字符(包括数量),而在正则中*表示任意数量个前一字符

通配符?表示一个字符,在正则中用.表示一个字符

正则表达式分为基础正则和扩展正则

 

基础正则:
^行首   
 $行尾    
.一个任意字符 *重复0个或者多个前一个字符     
\转义字符    \{n,m\}连续n到m个的前一重复字符,  \{n\}固定n个,\{n,\}n个以上   ({ 和 }在shell中是有特殊含义的)    
[  ]字符集,一个字符,里面可以使用反向选择^
扩展正则:
+重复一个或多个前一字符    
?0个或一个字符,注意区别通配符中的?    
 |或           
 ( )将字符包起后,可一起操作

 

 注意,[  ]中的字符集跟编码由关,比如[a-z],是表示a的编码到z的编码之间所有的字符,但是这个不是统一的,比如,当LANG=zh_TW 时编码顺序是0 1 2 3 4 ... a A b B c C d D ... z Z

一些特殊符号:

  1. 特殊符号    代表意义 
  2. [:alnum:]   代表英文大小写字元及数字,亦即 0-9, A-Z, a-z 
  3. [:alpha:]   代表任何英文大小写字元,亦即 A-Z, a-z 
  4. [:blank:]   代表空白键与 [Tab] 按键两者 
  5. [:cntrl:]   代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等 
  6. [:digit:]   代表数字而已,亦即 0-9 
  7. [:graph:]   除了空白字元 (空白键与 [Tab] 按键) 外的其他所有按键 
  8. [:lower:]   代表小写字元,亦即 a-z 
  9. [:print:]   代表任何可以被列印出来的字元 
  10. [:punct:]   代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $... 
  11. [:upper:]   代表大写字元,亦即 A-Z 
  12. [:space:]   任何会产生空白的字元,包括空白键, [Tab], CR 等等 
  13. [:xdigit:]  代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字元 

 注意一点,这里的[ ]不能取代上面所说的[ ],比如[:digit:]表示0-9,如果要是用,外面还要再包一层[ ], [[:digit:]]

 grep的一些进阶选项:

  1. [root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字串' filename 
  2. 选项与参数: 
  3. -A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来; 
  4. -B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来; 
  5. --color=auto 可将正确的那个撷取资料列出颜色 

 

 2.sed

灰常强大,灰常有用的工具,和awk一起称为流编辑的倚天剑屠龙刀啊,甚至可以看做是两门语言

sed是源于行编辑器ed的非交互式的流(stream-oriented)编辑器。记住它是一个编辑器,是和vi一类的东西。sed之所以称为“流”编辑器,是因为象大多数UNIX程序一样,输入流过它,然后被导向标准输出。sed编辑器逐行处理文件(或输入),把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行后将其从模式空间中删除,然后读入下一行进行处理和输出。应注意sed是对一行使用完了所有指令后再转到下一行的。sed的这种选择使得它可以方便地处理大文件(不必将整个文件一次读进内存)。sed是对文件副本进行编辑和修改,所以不用担心会修改或破坏原文件(除非是用了i参数)。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作和编写转换程序等。  

注意上面划线部分,要用它来理解sed中的所有操作

 要想完全掌握这个命令似乎要修炼很久啊,先把最基础的掌握吧

(感觉这篇文章还不错 http://doc.linuxpk.com/80440.html

 

用法:sed [-nefr] [动作]
-n,安静模式,配合动作p,列出处理行(不带n的p,会重复打印处理行)
-e,允许多次编辑,即一个sed有多种操作;操作是逐行进行的,在缓冲区中一次完成所有操作,所有操作顺序会对结果有影响
-f,将sed操作写在文件中,-f filename可以执行filename中的sed操作
-r,扩展正则
-i,修改写入源文件
动作说明:[定址] function
定址的形式可以是数字、正则,或者两者的结合。但是似乎不能多次定址?(比如‘1,3/RE/’,我原本的想法是在1到3行中有符合RE的行,但这是不合法的)
定位方式:
              x          一行号
              x,y       行号范围
              /pattern/ 查询包含模式的行
              /pattern/pattern/     查询包含两个模式的行
              /pattern/,x              在指定行号上查询匹配模式的行
              x,/pattern/              通过行号和模式查询匹配行
             /pattern1/,/pattern2/  查询两个模式之间的行(最小包含,查找到后继续以pattern1往后查找)
              x,y!                  查询不包含行号x,y的行
function有下面这些操作:
a:新增(当前行下一行) 
c:替换   (替换整行)
d:删除  
i:插入(当前行上一行)
p:打印,同-n一起使用  
s:搜索,也可以替换   ;g是s的参数,表示替换一行内所有符合的字符串,否则只替换一行内的第一个
例如:sed -n ‘1,20s/^fire/water/gp' file   将file中每行以fire开头的fire替换为water,并将替换的行全部打印出来
在上例中,s后面的RE应该不是定址,而是s附加的参数(/^fire/water/g),但是后面的p操作只打印了有字符串被替换的行,这是为什么呢?(这里的p属于替换的参数!!)
sed -n 's/\(La\)/\1kk/gp' dataf3  若数据行中有La字符串,则全部替换为Lakk打印出来
注意:注意参数和操作符的位置。
sed还能以脚本方式执行!!!
 
grep与sed的区别。grep ‘John’ datafile对应的sed命令是sed –n ‘/John/p’ datafile。区别:
(1)使用grep时,正则表达式没有包含在//分隔符中,而sed需要包含在//之间;
(2)sed默认会输出每一行,所以需要用-n命令阻止默认输出;
(3)返回状态。如果grep在文件中找到指定模式,将返回状态0,否则返回1。sed则
不管是否找到指定模式,它的退出状态都是0,只有命令存在语法错误时,sed的
退出状态才不是0。
原创粉丝点击