目录
一、正则表达式
1.元字符
①.:在正则表达式中.表示任意单个字符。
cpp
[root@pc1 data]#grep -o r.t /etc/passwd #过滤passwd文件中开头为r中间任意单个字符结尾为t的内容
rat
rat
rat
[root@pc1 data]#grep -o r..t /etc/passwd #过滤passwd文件中开头为r中间任意2个字符结尾为t的内容
root
root
root
root
r/ft
[root@pc1 data]#grep -o r...t /etc/passwd #过滤passwd文件中开头为r中间任意3个字符结尾为t的内容
rtkit
②[ ]:在正则表达式中[ ]表示匹配[ ]中任意一个字符。
cs
[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹
[root@pc1 data]#ls #显示文件夹内容
a.txt b.txt c.txt
[root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件
a.txt
b.txt
c.txt
③[^]:在正则表达式中表示匹配[ ]中外的任意单个字符。
css
[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件
[root@pc1 data]#touch {0..2}.txt #创建0-2.txt文件
[root@pc1 data]#ls #显示文件
0.txt 1.txt 2.txt a.txt b.txt c.txt
[root@pc1 data]#ls |grep '[^0-9].txt' #过滤ls显示文件中除去0-9任意字符.txt文件
a.txt
b.txt
c.txt
[root@pc1 data]#ls |grep '[^a-z].txt' #过滤ls显示文件中除去a-z任意字符.txt文件
0.txt
1.txt
2.txt
css
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
css
[root@pc1 data]#echo AB12ab | grep -o '[[:alpha:]]' #过滤输出内容的字母
A
B
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:alnum:]]' #过滤输出内容的字母和数字
A
B
1
2
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:lower:]]' #过滤输出内容的小写字母
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:upper:]]' #过滤输出内容的大写字母
A
B
2.表示次数
①*:表示匹配前面字符任意次,包括0次。
css
[root@pc1 ~]#echo ac |grep 'ab*c' #ab之间不输入b可匹配
ac
[root@pc1 ~]#echo abc |grep 'ab*c' #ab之间输入1个b可匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab*c'#ab之间输入2个b可匹配
abbc
②.*:表示匹配前面字符任意次,不包括0次。
cpp
[root@pc1 ~]#echo ac |grep 'ab.*c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配
abbc
③\?:表示匹配前面的字符1次或0次,即可有可无。
css
[root@pc1 ~]#echo ac | grep 'ab\?c' #ac之间不输入b可以匹配
ac
[root@pc1 ~]#echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到
④\+:表示匹配前面的字符最少1次。
css
[root@pc1 ~]#echo ac | grep 'ab\+c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配
abbbbc
⑤\{n\}:表示匹配前面的字符n次。
css
[root@pc1 ~]#echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到
⑥\{m,n\}:表示匹配前面的字符最少m次最多n次。
css
[root@pc1 ~]#echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配
abbc
[root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到
⑦\{m,\}:表示匹配前面的字符最少m次。
⑧\{,n\}:表示匹配前面的字符最多n次。
3.位置锚定
①^表示以什么字符开头的行。
②$表示以什么字符为结尾的行。
③^PATTERN$ 表示用于模式匹配整行 (单独一行 只有PATTERN字符)。
④^$ 表示空行。
⑤\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。
⑥\> 或 \b #词尾锚定,用于单词模式的右侧。
⑦\<PATTERN\> #匹配整个单词。
Dart
[root@pc1 ~]#cat a.txt #查看a.txt内容
root
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行
root
[root@pc1 ~]#cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc
abc
4.分组
()将多个字符捆绑在一起当做一个整体处理
Dart
[root@pc1 ~]#echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次
abcccc
[root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到
[root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功
abcabcabcabc
5.扩展正则表达式
①使用方法
grep -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \
②表示次数
* 匹配前面字符任意次
? 0或1次
- 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
③表示分组
() 分组
二、sed编译器
1.什么是sed编译器
sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2.sed编译器的工作流程
sed 的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,
除非是用重定向存储输出或者sed -i.
3.sed命令格式
命令格式:
Dart
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
选项:
css
-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
-h或--help:显示帮助;
-n或--quiet或------silent:仅显示script处理后的结果;
-V或--version:显示版本信息。
参数:
文件:指定待处理的文本文件列表。
常用操作:
|----|---------------------------------------------------------------------------------------------------------------------------------------------------------|
| 操作 | 作用 |
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下面增加一行指定内容 |
| i | 插入,在选定行上面插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| y | 字符转换,转换前后的字符长度必须相同 |
| p | |-------------------------------------------------------------------------| | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。 | |
| = | 打印行号 |
| l | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
sed的查找替换使用
格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换
注意:查找内容可使用正则表达式,替换内容不可使用正则表达式
css
举例1:
搜索/etc/passwd 中包含root字符的行
sed -nr '/root/p' /etc/passwd #-n关闭自动打印,-r启用扩展正则表达式查询root字符并打印
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin #查询结果
举例2:
使用sed关闭selinux
cat /etc/selinux/config #查看selinux配置文件内容
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#-i选项备份selinux配置文件后缀加.bak,在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。单引号中''s之前可加行号
后向引用
( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。
.*表示任意长度字符不管是什么字符
css
举例1:取ip地址
ifconfig ens33 |sed -nr 's/.*inet (.*) netmask.*/\1/p'
#查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用
.*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的
内容,p表示打印出来
192.168.30.11 #打印结果
举例2:
echo abc123XYZ | sed -nr 's/(abc)(123)(XYZ)/\3\2\1/p'
#打印abc123XYZ传给sed处理变成XYZ123ABC,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序
XYZ123abc #打印结果