正则表达式的定义
- 正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
- 正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
- 正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如前面提到的 Perl、Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
正则表达式用途
- 对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达式的魅力,而对于系统管理员来说,正则表达式则是必备技能之一。
- 正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
- 目前很多软件也支持正则表达式,最常见的就是邮件服务器。在 Internet 中,垃圾/广告邮件经常会造成网络塞车,如果在服务器端就将这些问题邮件提前剔除的话,客户端就会减少很多不必要的带宽消耗。而目前常用的邮件服务器 postfix 以及支持邮件服务器的相关分析软件都支持正则表达式的比对功能。将来信的标题和内容与特殊字符串进行对比,发现问题邮件就过滤掉。
- 除邮件服务器之外,很多服务器软件都支持正则表达式。虽然这些软件都支持正则表达式,不过字符串的对比规则还需要系统管理员来添加,所以作为系统管理员,正则表达式是必须掌握的技能之一。
查找特定字符 grep
-n显示行号
-i表示不区分大小写
set -G 标注行数
grep -n ‘the' httpd.conf 显示查找the
grep -n ‘th[io]en’ httpd.conf显示查找中间的的
grep -n 'oo' httpd.conf 查找包含重复单个字符“oo”
grep -n ‘[^w]oo’ httpd.conf oo前不以w开头的
grep -n '[^a-z]oo' httpd.conf 查找不是小写字母的为首行首
grep -n '[0-9]' httpd.conf 查找数字
grep -n '[0-9]*' httpd.conf 查找0-9加通配符,没有数字也会出来
grep -n ‘[^a-zA-Z]oo’ httpd.conf 不以字母为开头的只能查看到数字和标点符号
grep -n ‘^the’ httpd.conf 查找以the开头的行首
grep -n ‘’\.$'httpd.conf 以.为结尾的行
grep -n ‘^$’ httpd.conf 只查看空白行
grep -n ''w..d' httpd.conf 查看w开头d结尾的单词ward(里面有几个单词就有几个点)
grep -n ‘ooo*’ httpd.conf 查询包含至少两个oo以上的字符串
grep -n ‘woo*d’ httpd.conf 查询以w开头d结尾,中间至少一个o的字符串
grep -n ‘w.*d’ httpd.conf 查询以w开头d结尾
grep -n ‘[0-9][0-9]*’ httpd.conf 查询任意数字所在行
grep -n ‘o\{2\} ' httpd.conf 匹配2个以上的oo
grep -n ‘wo\{2,5\}’ httpd.conf 查询以w开头d结尾的,中间包含2~5个o
grep -n ‘wo\{2,5\}d’ httpd.conf 查询以w开头d结尾的,中间包含2个以上o
基础正则表达式常见元字符
扩展正则表达式常见元字符
sed 的工作流程主要包括读取、执行和显示三个过程。
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。再发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
常见的 sed 命令选项主要包含以下几种。
- -e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件。
- -f 或–file=:表示用指定的脚本文件来处理输入的文本文件。
- -h 或–help:显示帮助。
- -n、–quiet 或 silent:表示仅显示处理后的结果。
- -i:直接编辑文本文件。
“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,不一定会存在,代表选择进行操作的行数,如操作需要在 5~20 行之间进行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
- a:增加,在当前行下面增加一行指定内容。
- c:替换,将选定行替换为指定内容。
- d:删除,删除选定的行。
- i:插入,在选定行上面插入一行指定内容。
- p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
- s:替换,替换指定字符。
- y:字符转换。
sed -n ‘p’ hrrpd.conf 等同于cat查看内容
sed -n '3p' httpd.conf 输出第3行
sed -n '3,5p' aaahttpd.conf 输出第3和5行
sed -n 'n;p' httpd.conf 输出所有奇数行,n表示读入下一行
sed -n 'p;n' httpd.conf 输出所有奇数行,n表示读入下一行
sed -n '1,5{p;n}' httpd.conf 输出第1~5行之间的奇数
sed -n ‘10,&{n;p}’ httpd.conf 输出第10行至文件尾之间的偶数
sed -n '/the/p' httpd.conf 输出包含the的行
sed -n '4,/the/p' httpd.conf 输入从第4行至第一个包含
sed -n ’/the/=‘ httpd.conf 包含the的行,所在的行号
sed -n '/^PI/p' httpd.conf 输出以PI开头的行
sed -n '/^the/p' httpd.conf 以the为开头行
sed -n '/[0-9]$/p' httpd.conf 输出以数字结尾的行
sed -n ‘/\<wood\>/p’ httpd.conf 输出包含单词wood的行,\<、\>代表单词边界
删除符合条件的文本(d)
因为后面的示例还需要使用测试文件 test.txt,所以在执行删除操作之前需要先将测试文件备份。以下示例分别演示了 sed 命令的几种常用删除用法。
下面命令中 nl 命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
nl httpd.conf | sed ‘3d’ 删除第3行
nl httpd.conf | sed ‘3,5d’ 删除第3行第5行
nl httpd.conf | sed '/cross/d' 删除带有cross的行(原来的第六行)
red ‘/^[a-z]/d’ httpd.conf 删除以小写字母开头的行
sed ‘/\.$/d’ httpd.conf 删除以”.“结尾的行
sed ‘/^$/d’ httpd.conf 删除所有空行
sed ‘s/the/THE/’ httpd.conf 将每行中的the替换为THE
sed ‘s/l/L/2’ httpd.conf
sed ‘s/the/THE/g’ httpd.conf 将文件中所有the替换成THE
sed ‘s/o//g’ httpd.conf 将文件中的所有o删除
sed ‘s/^/#/’ httpd.conf 在每行首行插入#号
sed ‘/the/s/^/#/’ httpd.conf 行首是the的前面插入#
sed ‘s/$/EOF/’ httpd.conf 在每行行尾插入EOF
sed ‘3,5s/the/THE/g’ httpd.conf
sed ‘/the/s/o/0/g’ httpd.conf the中所有的o都替换成0
sed ‘/the/{H;d};$G’ httpd.conf 将the的行迁移至文件末尾
sed ‘1,5{H;d};17G’ httpd.conf 将1~5行内容转移到17行后
sed ‘/the/wout.file’ httpd.conf 将the的行另纯为文件out.file
sed ‘/the/r/etc/hostname’ 将/ect/hostname内容添加到the的每行后
sed ‘3aNew’ httpd.conf 在第三行插入一个新行,内容为New
sed ‘/the/aNew’ httpd.conf 在有the的每行后插入一个新行,内容为New
sed ‘3aNew1\nNew2’ httpd.conf 在第3行插入多行内容,中间的\n表示换行