目录
一.正则表达式
1.概述
正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间; 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2.正则表达式基本元字符
BRE和ERE的区别
基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已。
BRE: 只有^$.*[]
是元字符
ERE:^$.[]*+(){}?|
都是元字符
^ :行首定位符,如:^root 匹配以root开头的行
$ :行尾定位符,如:world$匹配以world结尾的行
. :匹配单个字符,如:r..t
* :匹配前导符0到多次 全部匹配 grep "o*" /etc/passwd (o出现0次或多次)
.* :匹配任意多个字符 (贪婪匹配
[] :匹配方括号中任意一个字符
[^] :匹配不在指定组里的字符 [^0-9]匹配除过0-9的字符
\ :转义字符,用于取消特殊符号的含义,如:\!、\$
\< :词首定位符 #由数字或字母组成的 \<root
\> : 词尾定位符
\(\) :匹配后的标签 # 在vim中测试
:%s@\(张三\) \(李四\) \(王五\)@ \3 \1 \2@g
3. 正则表达式拓展元字符
= 等于 != 不等于 =~ 匹配
+ :匹配一个或多个前导字符 [a-z]+oot
? :匹配零个或一个前导字符
a|b 匹配a或b
() :小括号可以将正则表达式的一部分括起来组成一个单元(也就是一个组),可以对整个单元使用数量限定符 如:(oo)+ 两个oo出现一次或者多个
x{m} :字符x重复m次
o{,3} :字符最多出现3次
x{m,} :字符x重复至少m次
x{m,n} :字符x重复m到n次
二.grep和egrep
egrep 支持正则表达式的拓展元字符 (或grep -E)
grep常用选项
-E:使grep支持扩展正则表达式,扩展选项为正则表达式,grep -E相当于egrep
-n:显示匹配的行的行号
-q:安静模式,也就是静默输出,不打印任何标准输出,如果有匹配的内容则立即返回状态值0
-v:取反(反向过滤)
-w:用于精确匹配
-R:搜索子目录
-i:不区分大小写针对单个字符
-o:只打印匹配到的字符
-c:显示有多少行被匹配到
1.基本实例
* 0或多个
[root@slave2 ~]# grep 'ro*' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
\< 词首定位符号 \>词尾定位符号
[root@newrain ~]# cat jack.txt
Jack JACK JAck jackly
:% s/\<[Jj]ack\>/123/g
$以什么结尾
[root@newrain ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
confluence:x:1000:1000:Atlassian Confluence:/home/confluence:/bin/bash
to:x:1003:1003::/home/to:/bin/bash
. 匹配单个字符
[root@newrain ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[] 匹配方括号中的任意一个字符
[root@newrain ~]# grep 'Root' /etc/passwd
[root@newrain ~]# grep '[Rr]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
扩展正则
1、+ 匹配一个或多个前导字符
[root@newrain ~]# egrep 'ro+t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
2、? 匹配零个或一个前导字符
[root@newrain ~]# egrep 'ro?t' /etc/passwd
abrt:x:1041:1041::/home/abrt:/bin/bash
3、a|b 匹配a或b
[root@newrain ~]# netstat -anlp|egrep ':80|:22'
[root@newrain ~]# egrep 'root|alice'
/etc/passwd root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
4、x{m} 字符x重复m次
[root@newrain ~]# cat a.txt
love
love.
loove
looooove
[root@newrain ~]# egrep 'o{2}' a.txt
loove
looooove
[root@newrain ~]# egrep 'o{2,}' a.txt
loove
looooove
[root@newrain ~]# egrep 'o{6,7}' a.txt
三.sed(流文本编辑器 )
sed是一种流编辑器,它是文本处理中非常适中的工具,能够完美的配合正则表达式使用,功能不同凡响。
sed "参数" '模式' 文件
参数:
-e | 使用指定脚本来处理输入的文本文件 |
-f | 指定一个规则文件 需求复杂的时候,需要匹配的内容多 |
-i | 直接修改文件内容,而不输出到终端。使用时-i.bak备份原文件。 |
-r | 扩展正则,将匹配不到的现在可以匹配到了 |
-n | 阻止输入行输出,仅显示脚本处理后的结果 |
模式 :
1 s 替换 2 g 整行(也可以是数字,替换第几个) 3 d 删除 4 p 打印 5 a 追加 6 i 是插入
[root@web-server ~]# cat rule.sed
/root/d
[root@web-server ~]# sed -f rule.sed passwd #-f指定规则文件
sed流编辑器用法及解析
1.删除 模式 d
删除sshd配置文件的注释和空行
sed '/^#.*/d;/^$/d' /etc/ssh/sshd_config
sed '1d' passwd //删除文件的第1行
sed '1,2d' passwd //删除文件的第1到2行
sed '2,$d' passwd //删除第2行到最后一行
sed '/root/d' passwd //匹配到root,删除此行
sed '/root/,2d' passwd //匹配到root行,到某一行
sed '1~2d' passwd //删除奇数行
sed '0~2d' passwd //删除偶数行
sed '/root/d' passwd ##删除匹配到root的行
sed '1d;2d' passwd ##删除第一行和第二行
2.添加 模式 a(在下一行加入) i(在上一行加入)
[root@web-server ~]# sed 4a\hello passwd //在第四行后添加hello
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
hello
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@web-server ~]# cat -n passwd | sed -e '2a hello nginx \ //添加多行
> nginx \
> mysql'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
hello nginx
nginx
mysql
3.替换 (s/aaa/bbb/g)
[root@web-server ~]# sed 's/root/ROOT/g' passwd ##替换全部的root为ROOT
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
[root@web-server ~]# sed 's/pattern/replace_string/gi' filename //忽略大小写替换
sed中的分隔符可以替换成别的字符, 因为s标识会认为后面的字符为分隔符
sed 's:text:replace_text:'
sed 's|text|replace_text|'
4.打印 参数 -n 模式 p
如果不加-n参数,就会将流入和流出的都打印。
[root@web-server ~]# sed -n '1p' passwd ## 打印第一行
root:x:0:0:root:/root:/bin/bash
[root@web-server ~]# sed -n '1,4p' passwd ##打印1到4行
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
5.插入 -i(直接修改文件内容,而不输出到终端)
[root@web-server ~]# sed -i '1a hello shell ' passwd ##在第一行后文件中插入
[root@web-server ~]# head -5 passwd
root:x:0:0:root:/root:/bin/bash
hello shell
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
由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔
sed -i.bak 's/pattern/replace_string/' filename
四.awk文本编辑器工具
简介:
awk是行处理器
,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题
,通常用来格式化文本信息。
awk 参数 'BEGIN{处理之前要做的} {处理内容} END{处理之后的内容}'
BEGIN{} {} 行处理前
END{} 行处理 行处理后BEGIN{} 在处理文本之前做的事情,只执行一次
{} 在处理文本是做的事情,有多少次执行多少次
awk 'BEGIN{i=1}{print i++}' /etc/passwd
END{} 在处理文之后做的事情,只执行一次
awk工作原理
awk -F":" '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束
(2)然后,行被:分解成字段,每个字段存储在已编号的变量中,从$1开始
(3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab
(4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$3间有一个,逗号。逗 号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格
(5)awk打印字段时,将从文件中获取每一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。
awk常用内置变量
NF | 浏览记录域的个数(表示字段数量, 当awk将行为记录时, 该变量相当于当前列号) |
FS | (输入字段分隔符) # 以什么符号去分割 |
OFS | (输出字段分隔符) # 以什么分隔符显示 |
NR | 已读的记录数(行数) |
FNR | 浏览文件的记录数 |
RS | 输入记录分隔符 |
ORS | 输出记录分隔符 |
实例
FS(输入字段分隔符)
awk 'BEGIN{FS=":"}{print $1,$2}' passwd ##以:为分隔符打印第一和第二列数据
root x
hello shell
OFS(输出字段分隔符)
awk 'BEGIN{FS=":";OFS="##"}{print $1,$2}' passwd ##以##为分隔符打印第一和第二列数据
root##x
hello shell ##
bin##x
daemon##x
NR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号
awk -F: '{print NR,$0}' passwd
1 root:x:0:0:root:/root:/bin/bash
2 hello shell
3 bin:x:1:1:bin:/bin:/sbin/nologin
FNR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号(不同文件分开)
awk '{print FNR,$0}' passwd aaa
1 root:x:0:0:root:/root:/bin/bash
2 hello shell
3 bin:x:1:1:bin:/bin:/sbin/nologin
4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 adm:x:3:4:adm:/var/adm:/sbin/nologin
1 lisi
2 wangwu
3 zhangsan
ORS(输出记录分隔符)
[root@web-server ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
hello shell
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
[root@web-server ~]# awk 'BEGIN{ORS=""}{print $0}' passwd
root:x:0:0:root:/root:/bin/bashhello shell bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin