Linux(入门基础):68---Linux通配符、正则表达式字符的使用(grep命令)

前言:

  • 正则表达式的字符和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

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/88081134