目录
一,正则表达式简要介绍
每个编程语言都有一套自己的正则库
1.正则表达式的组成
(1).一般字符:没有特殊意义的字符
(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
2.如下讲下正则表达式中的常见meta字符
linux正则表达式一般分为BRE,ERE。前者为基本正则表达式,后者为扩展正则表达式。他们都遵循POSIX规范,POSIX指的是可移植操作系统接口。ERE是BRE的扩展版本,具有更强的处理能力,并且增加了一些元字符。linux grep默认使用BRE,可以通过egrep或者grep -E来开启使用ERE。linux sed使用BRE中的一个子集,主要是为了保证处理的速度和效率。这些内容后续会持续更新。
(1).POSIX BRE与ERE中都有的meta字符:
\ : 通常用于打开或关闭后续字符的特殊含义,如(...)与{...}
. : 匹配任何单个字符(除NUL)
* : 匹配其前的任何数目或没有的单个字符,例: . 表示任一字符, 则 .* 匹配任一字符的任意长度
^ : 匹配紧接着的正则表达式,BRE中仅在正则表达式的开头有特殊的含义,ERE中在任何位置都有特殊含义
$ : 匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义
[] : 匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符,
(2).POSIX BRE中才有的字符:
{n,m} : 区间表达式,匹配在它前面的单个字符重现的次数区别。{n}指重现n次;{n,m}指重现n至m次;
( ) : 保留空间,可以将最多9个独立的子模式存储在单个模式中。如(ab).*\1 : 指匹配ab组合的两次重现,中间可存在任意数目的字符。
\n : 重复在(与)方括号内第n个子模式至此点的模式。
(3).POSIX ERE中才有的字符:
{n,m} : 与BRE的{n,m}功能相同
+ : 匹配前面正则表达式的一个或多个扩展
? : 匹配前面正则表达式的零个或一个扩展
| : 匹配|符号前或后的正则表达式
( ) : 匹配方括号括起来的正则表达式群
二,grep命令
Linux grep 命令用于查找文件里符合条件的字符串。
options
-a或--text 不要忽略二进制的数据。
-A <显示列数>或--after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
-b或--byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
-B<显示列数>或--before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
-c或--count 计算符合范本样式的列数。
-C<显示列数>或--context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作>或--directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>或--regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
-E或--extended-regexp 将范本样式为延伸的普通表示法来使用。
-f<范本文件>或--file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
-F或--fixed-regexp 将范本样式视为固定字符串的列表。
-G或--basic-regexp 将范本样式视为普通的表示法来使用。
-h或--no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H或--with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。
-i或--ignore-case 忽略字符大小写的差别。
-l或--file-with-matches 列出文件内容符合指定的范本样式的文件名称。
-L或--files-without-match 列出文件内容不符合指定的范本样式的文件名称。
-n或--line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
-q或--quiet或--silent 不显示任何信息。
-r或--recursive 此参数的效果和指定“-d recurse”参数相同。
-s或--no-messages 不显示错误信息。
-v或--revert-match 反转查找。
-V或--version 显示版本信息。
-w或--word-regexp 只显示全字符合的列。
-x或--line-regexp 只显示全列符合的列。
-y 此参数的效果和指定“-i”参数相同。
--help 在线帮助。
grep正则表达式元字符集
^ :锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ :锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. :匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
:匹配零个或多个先前字符 如:'grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] :匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] :匹配一个不在指定范围内的字符,如:'A-FH-Zrep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
.. :标记匹配字符,如'love',love被标记为1。
**<** :锚定单词的开始,如:'<grep'匹配包含以grep开头的单词的行。
**>** :锚定单词的结束,如'grep>'匹配包含以grep结尾的单词的行。
x*{**m*}** :重复字符x,m次,如:'o{5}'匹配包含5个o的行。
x*{m,***}** :重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
x*{m,**n*}** :重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5-10个o的行。
\w :匹配文字和数字字符,也就是*[A-Za-z0-9]**,如:'G\wp'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W :\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b :单词锁定符,如: '\bgrepb'只匹配grep。
用于egrep和 grep -E的元字符扩展集
+ :匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
? :匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。
a|b|c :匹配a或b或c。如:grep|sed匹配grep或sed
() :分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
x*{m},x{m,},x{m,n}** :作用同x*{m**},x*{m,***},x**{m*,**n*}**
三,sed命令
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-
-h或--help 显示帮助。
-
-n或--quiet或--silent 仅显示script处理后的结果。
-
-V或--version 显示版本信息。
动作说明:
-
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
-
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-
d :删除;
-
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
-
s :取代,通常这个 s 的动作可以搭配正规表示法!
#以行为单位的新增/删除
[root@www ~]# nl /etc/passwd | sed '2,5d'
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
#以行为单位的替换与显示
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
#数据的搜寻并显示
nl /etc/passwd | sed '/root/p' #搜索 /etc/passwd有root关键字的行
#数据的搜寻并执行命令
#搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
#数据的搜寻并替换
[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'