trytete 发表于 2015-6-23 08:59:13

正则表达式和grep、sed工具

what is 正则表达式
   一种处理字符的方法,只要命令工具(例:grep、sed、awk等)支持这种方法,就可以用来处理正则表达式字符串。通过特殊字符的帮助,我们就容易达到查找、删除、替换特定字符串的命令程序。
用途
   信息过滤,信息匹配,获取有用信息
常用的表达式含义

[*]^ 行首标记#^haha,匹配以haha起始的行

[*]$ 行尾标记

[*]. 匹配任意单个字符

[*]? 匹配之前的项一次或0次#blu?e 匹配blue或ble

[*]+ 匹配之前的项一次或多次

[*]* 匹配之前的项0次或多次

[*][] 匹配包含在[]中的任意一个字符#ad 匹配abd或acd

[*][^] 匹配除了[^]以外的任意一个字符#a[^bc] 匹配ad、ae...

[*][-] 匹配[-]一段字符中的任意一个字符# 匹配1-9任意一个字符

[*]() 创建一个用于匹配的子串#ab(cde)?匹配ab或abcde

[*]{n} 匹配之前的项n次#{3}相当于

[*]{n,} 之前的项至少匹配n次

[*]{n,m} 之前的项匹配n-m次

[*]| 匹配两边的任意一项#(a | b) 匹配a或b

[*]\ 转义

[*][:alnum:] 大小写英文和数字

[*][:alpha:] 大小写英文

[*][:digit:] 数字

[*][:lower:] 小写英文

[*][:upper:] 大写英文

[*][:blank:] TAB或空格

[*][:punct:] 标点符号

grep
grep [-n 行号] [-v 反选] [-A 输出后几行] [-B 输出前几行] [-C 输出前后几行] [-i 忽略大小写] [-o 打印匹配到的而不是整行] [-b 匹配到的字符偏移] [-l 搜索匹配文本在那个文件中] [-L 和-l相反] [-e 匹配多个] [-r或-R 递归搜索,可指定include和exclude] [-q 静默输出成功返回0] [--color=auto 颜色高亮]

[*]对于扩展正则表达式+ ?| () 需要使用grep -E或egrep使用

[*]例:截取dmesg的eth0信息,高亮显示,并显示前两行后三行,显示行号



[*]参数-o




[*]参数-b




[*]参数-l和L




[*]参数-e




[*]参数-r和-R






PS:有时候因为语系的不同,用到类似这样的表达式的时候会有错误,编码顺序不同导致的例如zh_CN.big5和C两种语系

[*]LANG=C时:01234....ABCD..YZabcd....xyz

[*]LANG=zh_CN :01234....aAbBcC....zZ

可用[:lower:]代替

sed:流编辑器 stream editor
   可以对数据进行:插入、删除、替换并打印到屏幕上,或进行直接写入,还可以进行部分数据查找替换、已匹配字符串标记和子串匹配标记
sed [-i 直接写入] [-e 连续操作] [-n 静默模式] ‘ 操作内容 ’
1:新增a,i   删除d   替换c   显示p,-n            //(根据行号)

[*]# nl /etc/passwd | sed '2a hello'    // 第二行下面增加

   1   root:x:0:0:root:/root:/bin/bash
   2   bin:x:1:1:bin:/bin:/sbin/nologin
hello
   3   daemon:x:2:2:daemon:/sbin:/sbin/nologin

[*]# nl /etc/passwd | sed '2i hello'    // 第二行上面增加

   1   root:x:0:0:root:/root:/bin/bash
hello
   2   bin:x:1:1:bin:/bin:/sbin/nologin


[*]d

[*]# nl /etc/passwd | sed '2,4d'    // 删 2-4行   

   1   root:x:0:0:root:/root:/bin/bash
   5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[*]# nl /etc/passwd | sed '2,5c hello'         // 第2-5 行换掉

   1   root:x:0:0:root:/root:/bin/bash
hello
   6   sync:x:5:0:sync:/sbin:/bin/sync


[*]# nl /etc/passwd | sed -n '2,4p'               // 显示 2-4 行 ,-n(安静模式)不加输出差别很大

   2   bin:x:1:1:bin:/bin:/sbin/nologin
   3   daemon:x:2:2:daemon:/sbin:/sbin/nologin
   4   adm:x:3:4:adm:/var/adm:/sbin/nologin
2:部分数据查找替换
   sed ‘s/要替换字段/新字段/g’   # 's///ng' 每行第n个开始才进行替换
   例如:截取eth0的ip地址

[*]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.159.131

   和正则表达式结合

3:已匹配字符串标记&


4:字串匹配标记\1\2
   格式:'s/() ()/\1 \2'




国安信仰 发表于 2015-6-25 08:55:19

学习了!
页: [1]
查看完整版本: 正则表达式和grep、sed工具