‘?
正则表达式
正则表达式定义
正则表达式又称正规表达式、常规表达式。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
元字符
^ : 匹配输入字符串的开始位置,除非再方括号表达式中使用,表示不包含该字符集合
. : 匹配除“\r\n”之处的任何单个字符
\ : 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
*: 匹配前面的子表达式零次或多次
[ ] : 字符集合,匹配所包含的任意一个字符
[^] : 赋值字符集合,匹配未包含的一个任意字符
[n1-n2] : 字符范围,匹配指定范围内的任意一个字符
{n} : n是一个非负整数,匹配确定的n次
{n,} : n是一个非负整数,至少匹配n次
{n,m} : m和n均为非负整数,其中n<=m,最少匹配n次最多匹配m次
\<....\> :匹配某一个单词的行
\> : 匹配以..结尾的行
\< 匹配以....开头的行
grep
- -n :表示显示行号
- -l表示不区分大小写
- -v 表示过滤
- [ ] 查找集合字符
[root@localhost ~]# grep -n 'root' xy.txt 查找带有root的行并显示行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n '[ a ]' xy.txt 查找带有a的字符
1:root:x:0:0:root:/root:/bin/bash
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
sed
文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等,并且可在五交互的情况下实现相当复杂的文本处理操作,被广泛应用与shell脚本,以完成自动化处理任务,且sed依赖于正则表达式
工作原理
读取---------执行--------显示
sed命令格式
sed -n '编辑指令' 文件1 文件2
sed -n -e '编辑指令' 文件1 文件2
sed -i -e '编辑指令' 文件1 文件2
常用选项
- -e :指定要执行的命令,只有一个编辑命令时可省略
- -n : 只输出处理后的行,读入时不显示
- -i : 直接编辑文件,而不输出结果
- -f :用指定的脚本文件来处理输入的文本文件
p :打印指定的行
d :删除指定的行
s :字串替换,格式: “行范围s/原字符串/新字符串/g”
g :表示只要符合条件,全部进行处理
r :可以将另一个文件内容读取到文件中
w :可以将另一个文件内容覆盖到文件中
i :插入,在当前行上面插入一行或多行
a :插入,在当前行后面插入一行或多行
c :将选定行替换成指定内容
y :字符转换
[root@localhost ~]# sed '1p' xy.txt #不加选项是输出执行后和显示的结果
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost ~]# echo hello world gg | sed -nr 's/(hello) (world) (gg)/ \2 \1 \3/p'
world hello gg
[root@localhost ~]# sed -n '1p' xy.txt #加-n显示的是执行后的结果不过显示的结果
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '/^root\|nologin$/p' xy.txt #输出执行后的结果,以root开头或者nologin结尾的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
awk
筛选、过滤、匹配
awk关键字 选项 命令部分 '{xxxx}' 文件名
awk {'print "'$变量名'"}' #映入awk外部变量
内建变量
- NF :当期处理的行的字段个数
- NR :当前处理的行的行号
- $0 :当前处理的行的整行内容
- $n :当前处理的行的第n个字段
- FS :指定每行文本的字段分隔符,默认为空格或制表位
- OFS :指定输出时文本列之间的连接符
- RS :数据记录分隔符,默认为\n,即每行为一条记录
- ORS :指定每行之间连接型
[root@localhost ~]# awk '{print}' p.txt #查看文件全部内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# awk -F: '{print $1 }' p.txt #以:为分隔符查看文件的第一行内容
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@localhost ~]# awk -F: '{print $1,$2 }' p.txt #以:为分隔符,打印第一行第二行
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
[root@localhost ~]# awk -F: '{print NR }' p.txt #打印行号
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# awk '(NR%2)==1{print}' p.txt ¥打印奇数行的内容
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin