通配符用来匹配文件或文件名
正则表达式则是为了查找对应的文件内容
基本语法
linux规范将正则表达式分为了两种
- 基本正则表达式(BRE、basic regular expression)
BRE对应元字符有
^ $ . [ ] *
^字符
匹配以这个字符开头的行
字符$
匹配以这个字符结尾的行
^$
以空开头,空结尾===空行
.
匹配除了换行符以外所有的内容,除了换行符。
\b
匹配单词边界,如我想从字符串中“This is Regex”匹配单独的单词 “is” 正则就要写成 “\bis\b”
hello world
helloworld
\n 匹配换行符 ,表示newline,向下移动一行,不会左右移动
\r 匹配回车符,表示return,回到当前行的最左边
在windows中,换行符号是 \r\n
linux中,换行符就是\n
linux中输入 enter键,表示\r \n
linux换行符是\n,表示\r+\n 换行且回车,换行且回到下一行的行首
windows换行符是\r\n,表示回车+换行
\t 匹配一个横向的制表符,等于tab键
其他符号是普通字符
; \
- 扩展正则表达式(ERE、extended regular expression)
ERE在在BRE基础上,增加了
( ) { } ? + | 等元字符
*和+的区别
语法
*是重复0次、重复多次,因此没匹配到的行也过滤出来了
+是重复1次、多次、因此至少匹配到1次才看到
- 转义符
反斜杠 \
反斜杠用于在元字符前添加,使其成为普通字符
写shell脚本时还原字符集
LC_ALL=C
这个变量赋值的动作,是等于还原linux系统的字符集
通配符和正则的区别
1.从语法上就记住,只有awk、gred、sed才识别正则表达式符号、其他都是通配符
只有用这3个命令的操作,你写下的特殊符号,才是正则表达式---提取数据流的关键信息
其他linux命令的操作,都是通配符的概念,以及------查找文件名
2.从用法上区分
- 表达式操作的是文件、目录名(属于是通配符)
- 表达式操作的是文件内容(正则表达式)
3.比如如下符号区别
通配符和正则表达式 都有 * ? [abcd] 符号
通配符中,都是用来标识任意的字符
如 ls *.log,可以找到a.log b.log ccc.log
正则中,都是用来表示这些符号前面的字符,出现的次数,如
grep 'a*'
实际案例
通配符,一般用于对文件名的处理,查找文件
如ls命令结合*
意思是匹配任意字符
[root@130 test]# ls *.log
1.log 2.log 3.log 4.log 5.log
而三剑客,结合*符号,是处理文件内容,如grep
此时的*作用就不一样了
[root@130 ~]#ls
anaconda-ks.cfg
[root@130 ~]#touch Yyyy.txt
[root@130 ~]#touch zzzz.txt
[root@130 ~]#ls [a-z]*.txt
Yyyy.txt zzzz.txt
[root@130 ~]#find /root -name '[a-z]*.txt'
/root/zzzz.txt
[root@130 ~]#find /root -name '[a-Z]*.txt'
/root/Yyyy.txt
/root/zzzz.txt
#这种写法不太规范,但是也能进行查询,尽量以下方规范写法进行查询
[root@130 ~]#find /root -name '[a-z][A-Z]*.txt'
/root/Yyyy.txt
/root/zzzz.txt
练习
基础正则表达式
^ 以什么开头,"^yuchao" 表示匹配以yuchao单词开头的行
$ 以什么结尾,"yuchao$",表示匹配以yuchao单词结尾的行
^$ 组合符号,表示空行。逻辑解释就是以^开始,以$结尾的行
. 匹配任意且只有一个字符,但是不匹配空行
\ 转义字符,让特殊符号失效,如"\."只表示小数点
* 匹配前一个字符(连续出现)0次或1次以上,注意,当重复0次的时候,表示什么也没有,但是会撇皮所有内容
.* 组合符,匹配所有内容
[abc] 匹配[]内包含的任意一个字符a或b或c
[a-z] 匹配[]内包含a-z任意一个字符
[0-9] 匹配[]内包含0-9的任意一个数字
[^abc] 匹配不包含^后的任意字符a或b或c,这里的^表示对[abc]的取反,与在外面的^意义不同
扩展正则表达式
--------------------
+ 匹配前1个字符1次或多次
[:/]+ 匹配括号内的 ":" 或 "/" 字符1次或多次
? 匹配前一个字符0次或1次
| 表示或者,即同时过滤多个字符串
() 分组过滤,被括起来的内容表示一个整体,另外()的内容可以被后面的\n引用,n为数字,表示引用第几个括号的内容
\n 引用前面()里的内容,例如(abc)\1 表示匹配abcabc
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{,m} 匹配前一个字符最多m次
a{n} 匹配前一个字符正好n次