前言:
- 正则表达式的字符和Linux通配符是不同的,使用起来不一样
- !号不属于特殊字符,不需要用\转义
一、Linux通配符
包含以下
* | 代表0到无穷多个字符 |
? | 代表一定有一个任意字符 |
[] | 代表一定有一个在[]内的字符,重点:只能是其中的一个。例如h[abc]d,可以是had,hbd,hcd |
[ 编码1 - 编码2 ] | -连接的意思,代表在编码1和编码2之间的所有字符。例如[0-9]代表0和9之间的所有数字,因为数字的语系编码是连续的 |
[^] | 反向选择的意思。例如[^abc]代表一定有一个字符,只要是非a、b、c的其它字符就接受的意思 |
[:alnum:](常用) | 代表英文大小写及数字。0-9,A-Z,a-z |
[:alpha:](常用) | 代表任何英文大小写字符。A-Z,a-z |
[:blank:] | 代表空格键与tab键 |
[:cntrl:] | 代表键盘上面控制按键,包括CR、LF、Tab、Del等 |
[:digit:](常用) | 代表数字。0-9 |
[:graph:] | 除了空格符(空格键与tab键)外的其他所有按键 |
[:lower:](常用) | 代表英文小写字符。a-z |
[:print:] | 代表任何可以被打印出来的字符 |
[:punct:] | 代表标点符号。"、'、?、!、;、#、&等 |
[:upper:](常用) | 代表英文大写字符。A-Z |
[:space:] | 代表会产生空白的字符。包括:空格键、Tab、CR等 |
[:xdigit:] | 代表十六进制的数字类型。包括0-9、A-F、a-f |
二、正则表达式
1.概念
- 正则表达式就是处理字符串的方法,它以行为单位来进行字符串的处理操作。可以让用户轻易地完成查找、删除、替换某特定字符串的处理过程
2.注意事项
- 正则表达式与通配符使完全不一样的东西。通配符是bash操作接口的一个功能,正则表达式是处理字符串的表示方式
三、语系对正则表达式的影响
1.引入
- 文件在内存中的记录仅有0和1,我没看到的文字与数字都是通过编码转换而来的,因此不同语系的编码数据并不相同,就会造成数据选取结果的差异
- 所以不同环境下语系不同,可能使用正则表达式选取的结果也会有所差异
2.例如
不同的语系输出的结果并不同
- LANG=C时:0 1 2 3.. A B C D...Z a b c.....z
- LANG=zh_CN时:0 1 2 3...a A b B c C....z Z
3.使用正则表达式的提前准备
使用之前设置语系
- export LANG=C
- export LC_ALL=C
四、正则表达式的特殊字符
^ | 下面会介绍 |
$ | 下面会介绍 |
. | 下面会介绍 |
\ | 下面会介绍 |
*(与Linux通配符是不同的) | 下面会介绍 |
[] | 和Linux通配符是相同的 |
[ - ] | 和Linux通配符是相同的 |
[^ ] | 和Linux通配符是相同的 |
{,} | 下面会介绍 |
五、grep命令
1.功能
- grep是对一行进行分析,若有我们想要的,就将该行取出来。也可以得到去除我们想要的内容的其它内容
2.命令格式
- grep [参数] [--color=auto] '查找字符' [文件名]
相关参数与选项
扫描二维码关注公众号,回复:
5401718 查看本文章
- -a:将二进制文件以文本文件的形式查看
- -c:计算出找到的'查找字符'的个数,总共有多少行(是行数,不是个数)
- -i:忽略文件中的大小写
- -n:顺便输出行号
- -v:反向选择,即输出没有‘查找字符’的那一行
- --color=auto:可以将找到的关键字部分加上颜色显示,这是默认的参数
- -A:后面接数字。代表除了有查找字符的那一行外,前面多少行也显示出来(after)
- -B:后面接数字。代表除了有查找字符的那一行外,后面多少行也显示出来(before)
六、grep的基本使用
- 案例一:显示含有'the'的行,并显示行数
- 案例二:反向选择,把不含有'the'的行显示出来
- 案例三:使用ls查看/etc目录时,每一行以'l'开头的行,即查看链接文件(因为文件权限前面为'l'代表这个文件为连接文件)
- 案例四:承上,查看有几个链接文件,再加上wc
七、Linux通配符[]、[^]、[-]的基本使用
- 案例一:查找文件中test、taste这两个关键字
- 案例二:查找文件中含有'oo'字符的地方
- 案例三:查找文件中'oo'字符前不带'g'这个字符的地方
为什么第18行和第19行也显示:
18行:虽然google不符合我们的命令要求,但是后面too也符合我们语句的意思,因此这一行也显示出来
19行:因为'oo'前面也可能是o也符合我们的命令要求,例如:goo(ooo)ogel,所以被列出来
- 案例四:显示'oo'前面不是小写字母的行
- 案例五:同上,使用[:lower:]显示'oo'前面不是小写字母的行
- 案例六:查看有数字的行
八、正则表达式^、$、\字符的使用
^ | 放在一个字符前面,代表这个字符是这一行的行首元素 |
$ | 放在一个字符后面,代表这个字符是这一行最末尾的字符 |
\ | 转义符。将特殊字符\,“?”,“[]”等转义 |
- 案例一:查找每一行以the开头的行
- 案例二:查看以小写字母开头的行
- 案例三:查找开头不是英文字母的行
- 案例四:找出行位以.结尾的行
因为.为特殊字符,所以用转义符\转义一下
注意:要查找的行的换行符必须是unix换行符$才可以查找,以dos换行符^M$结束的行不显示。文件中5-9行也以.结束,但是以^M$结束,所以不显示
- 案例五:查找空白行(空白行也就是以换行符开头的行)
- 案例六:有时候我们为了只查看数据,想把空白行和带有#开头的行去除掉,就可以使用下面方法。(/etc/rsyslog.conf文件就有很多注释和空白行)
九、正则表达式字符.与*的使用
. | 与Linux通配符的?是相同的意思,一个.就代表一定有任意一个字符的意思 |
*(与Linux通配符是不同的) | *代表,重复0个或者多个前面的字符。重点:*只与前面那个字符有关,而与前面的前面的那个字符无关。xy*就代表"x","xy","xyy","xyyy"...都会被列出来 |
.* | .代表一定有一个字符,而*前面的字符代表0到无穷多个,所以.*就代表0到无穷多个任意字符 |
- 案例一:查找以'g'开头,'d'结尾,且中间有两个字符的行
- 案例二:因为*代表0个或一个前面的字符
- ①所以使用'o*',含有'','o',"oo","ooo..."的行都会被列出来,也就是所有的行都会被显示出来(因为""代表空)
- ②所以使用'oo*',含有'o','oo',"ooo..."的行都会被列出来(至少有1个o)
- ③使用"ooo*",含有"oo","ooo","oooo..."的行都会被列出来(至少有2个o)
- .......以此类推
- 案例三:我们想查找以"g"开头,以"g"结尾的行。(.与*配合使用,代表0个或多个任意字符)
错误方式:因为g*代表0个或多个,所以:g、gg、ggg、gggg....都会被列出来,而不是列出来以g开头,以g结尾
正确方式:使用g.*g,因为.代表一定有一个字符,而*前面的字符代表0到无穷多个,所以.*就代表0到无穷多个
十、正则表达式字符{}的使用
{} | {}则是可以显示这个字符重复的次数。有三种形式 例如:o{2}2个字母o。o{2,5}代表2-5个字母o。o{2,}代表2个字母o及2个字母o以上 |
注意事项 | 因为{}属于特殊字符。所以使用是'{'和'}'前面都会使用是一个\转义符。下面的案例中也是 |
- 案例一:查找两个字母o
- 案例二:查找以'g'作为开头,以'g'结尾的字符串,并且中间必须有2-5个o行(可以看到第19行没有了,因为19行中间有6个o)
- 案例三:查找文件中有3-5个o的行
- 案例四:查找1.txt中有两个及以上数量的o
- 案例五:查找3个及以上数量的o