12.26&12.27
正则表达式
第1章 使grep/egrep 过滤出的东西加上颜色
cat >>/etc/profile<<EOF
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
EOF
source /etc/profile
alias grep egrep
第2章 正则表达式分类
2.1 基础正则表达式:basic regular expression BRE
^ $ . * [] [^] \
2.2 扩展正则表达式:extended regular expression ERE
| + () {} ?
2.3 正则与通配符区别:
作用 支持的命令
通配符: 查找文件名 Linux大部分命令都支持 以.txt结尾的文件
正则: 在文件中过滤内容 sed,grep,awk Python Java
2.4 使用正则表达式注意事项
1.正则表达式按照行为单位处理
2.正则神坑-中文符号
‘’ “” () 。 * …… ¥ | {} 【】
'' "" () . * ^ $ | {} []
3.区分大小写
环境
cat oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
第3章 基础正则(BRE)
3.0.1 ^ 以……开头的行
grep ‘^m’ /oldboy.txt 以m开头的行
3.0.2 $ 以……结尾的行
grep ‘m$’ /oldboy.txt
神坑:::::有的行结尾有时候会多个空格
cat -A 显示出文件中的特殊标记 行尾 $标记
3.0.3 ^$ 空行 什么都没有(包括空格也没有)
grep -v '^$' oldboy.txt 排除文件中的空行
grep -n 显示行号
3.0.4 . 任意一个字符 不会匹配空行
grep ‘.’ oldboy.txt
grep -o 显示命令执行过程,显示grep命令每一次找到了什么
空格也执行一次命令
3.0.5 * 前一个字符连续出现了0次或0次以上
grep ‘0*’ oldboy.txt
坑:过滤的目标出现了0次的时候,会显示整个文件的内容
3.0.6 .* 所有 任何符号 包含空行
贪婪性 ( . * .* + ? )
1. .*所有符号 任何符号 连续出现的字符 有多少匹配多少
2. 正则表达 所有符号 或 连续出现 会表现出贪婪性
3. 匹配到最后一个符合的条件---------(贪婪性)
找出以m开头并以m结尾的行 ---- 并且
[root@oldboy oldboy]# grep '^m.*m$' oldboy.txt
my blog is http://oldboy.blog.51cto.com
3.0.7 \ 撬棍 转义字符 脱掉马甲打回原形
找出文件中以.结尾的行
[root@oldboy log]# grep '\.$' /oldboy/oldboy.txt
I teach linux.
not 4900000448.
tr命令 1.不能直接修改文件内容
2.一对一替换
特点 3.无法直接读取文件内容 接 <
\n =====回车
例:把文件中的空格替换为回车
[root@oldboy oldboy]# tr '\n' ' ' oldboy.txt 回车替换为空格
tr: extra operand `oldboy.txt' tr不能直接读取文件
Try `tr --help' for more information. 必须加<输入重定向符号
[root@oldboy oldboy]# tr '\n' ' ' <oldboy.txt
I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!
报错:tr命令无法直接读取文件 必须加< 不能修改文件内容
替换:把123替换为abc sed 阉割版
[root@oldboy oldboy]# echo 123123|tr '123' 'abc'
abcabc
一对一替换
[root@oldboy oldboy]# echo 12332|tr '123' 'abc'
abccb
3.0.8 [ ] [abc] 找出包含a或b或c的行 []字符内没有特殊含义
单个字符分割,以”或”连接
找出以小写字母开头并以.或!结尾的行
[root@oldboy oldboy]# grep '^[a-z].*[.!]$' oldboy.txt
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
3.0.9 [^] 排除,相当于是一个符号(每次匹配一个字符) 排除a或b或c
找出文件中不是以m或n开头的行
[root@oldboy oldboy]# grep '^[^mn]' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our size is http://blog.oldboyedu.com
grep/egrep ‘[a-Z]’
第4章 扩展正则(ERE)
4.0.1 + 前一个字符连续出现一次或多次
grep -E ===egrep
[root@oldboy log]# egrep '0+' /oldboy/oldboy.txt
my qq is 49000448
not 4900000448.
+小结:
1.前一个字符连续出现1次或一次以上
2.+一般与[]进行配合
例题:
lidao.×××
cat id.txt
汤 610702199107053598
邹 371481199403259478
莫 52020319810613433X
韩 460106199111137270
荣 530124197504135438
荣 oldboy
荣 babygirl
荣 530124197504135438
阮 360702197902169951
翁 331002198504132813
任 621223198708245176
姜 370602198507189574
霍 320904198403048179
如何判断用户的×××号码是否正确?
特殊符号帮助我们处理文件====正则表达式
在文件中过滤出你想要的或不想要的内容
解答: egrep '[0-9X]+' id.txt
[root@oldboy log]# egrep '[0-9X]+' /oldboy/id.txt
汤 610702199107053598
邹 371481199403259478
4.0.2 | 或者
找出3306或1521端口服务
[root@oldboy log]# egrep '3306|1521' /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
4.0.3 () 表示一个整体 反/后向引用
找出文件中包含oldboy或oldbey的行
[root@oldboy log]# egrep 'oldb(o|e)y' /oldboy/oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
4.0.4 ( ) 反向引用/后向引用----sed 先保护在使用
sed -r 识别扩展正则
使输出结果为 12<34>56 这个就叫后向引用
[root@oldboy oldboy]# echo 123456 |sed -r 's#(12)(34)(56)#\1<\2>\3#g'
12<34>56 \2对应前面第几个
12.27
4.0.5 {} 0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m次
0{n,m} 前一个字符至少连续出现n次,最多连续出现了m次
0{n} 前一个字符连续出现n次
0{n,} 前一个字符至少连续出现n次
0{,m} 前一个字符最多连续出现了m次
例:查找文本中0最少出现3次最多出现4次的行
[root@oldboy oldboy]# egrep '0{3,4}' oldboy.txt
my qq is 49000448
not 4900000448.
例:查找文本中0出现3次的行
[root@oldboy oldboy]# egrep '0{3}' oldboy.txt
my qq is 49000448
not 4900000448.
找出0连续出现了三次的行(正好三次)
[root@oldboy oldboy]# egrep '^.*[^0]0{3}[^0].*$' oldboy.txt
my qq is 49000448
错误:加号在花括号前面,花括号失效
4.0.6 ?前一个字符出现零次或一次
[root@oldboy oldboy]# cat good.txt
good
gd
god
goood
[root@oldboy oldboy]# egrep 'go?d' good.txt
gd
god
4.1 ERE小结
1. +一般与[]进行配合 把各种连续的东西取出来
2. | 或
3. () 一个整体 后向引用---sed
4. {} 0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m次
5. ? 前一个字符出现了零次或一次
4.2 基础正则与扩展正则的区别
基础正则: grep/sed/awk
扩展正则: egrep/sed -r/awk
4.3 grep/sed 可以加\转义符号识别扩展正则
[root@oldboy oldboy]# grep 'go\+d' good.txt
good
god \只能转义对单个字符 鸡肋
goood
补充:了解
4.4 正则总结
1. grep/egrep -o和颜色是grep独有
2. 一步步分解
4.5 正则学习资料
man grep
info sed/awk/grep
https://www.gnu.org/software/grep/manual/grep.html
转载于:https://blog.51cto.com/13517084/2056165