正则表达式,又称规则表达式,(英语:Regular Expression)在代码中常简写为 regex、regexp 或 RE ,计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文
正则表达式,又称规则表达式,(英语:Regular Expression)在代码中常简写为 regex、regexp 或 RE ,计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式不只有一种,而且 Linux 中不同的程序可能会使用不同的正则表达式,如:
工具:grep sed awk egrep
正则表达式——通常用于判断语句中,用来检查某一字符串是否满足某一格式
正则表达式是由普通字符与元字符组成
普通字符:包括大小写字母、数字、标点符号及一些其他符号
元字符:是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
LINUX 中常用的有两种正则表达式引擎
基础正则表达式:BRE
扩展正则表达式:ERE
格式:
grep [选项]... 查找条件 目标文件
选项 | 含义 |
---|---|
-E | 开启扩展(Extend)的正则表达式 |
-c | 计算找到 ‘搜寻字符串’ 的次数 |
-i | 忽略大小写的不同,所以大小写视为相同 |
-o | 只显示被模式匹配到的字符串 |
-v | 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!(反向查找,输出与查找条件不相符的行) |
- -color=auto | 可以将找到的关键词部分加上颜色的显示 |
-n | 顺便输出行号 |
示例: | |
例1:统计root字符总行数 |
[root@localhost home]# grep -c root /etc/passwd
2
[root@localhost home]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost home]# grep -i "the" test.txt
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
例3:过滤出IP
[root@localhost home]# ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"| head -1
192.168.118.4
常见元字符:(支持的工具:grep、egrep、sed、awk)
特殊字符 | 含义 |
---|---|
(反斜杠)\ | 将特殊字符进行转义,忽略其特殊意义 |
^ | 匹配行首,^ 则是匹配字符串的开始 ^tux 匹配以 tux 开头的行 |
$ | 匹配行尾,$ 则是匹配字符串的结尾 tux$ 匹配以tux结尾的行 |
. | 匹配除换行符\r\n之外的任意单个字符 |
[list] | 匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9] |
[ ^list ] | 匹配任意不在list列表中的一个字符 例: [ ^a-z ]、[ ^0-9 ]、 [ ^A-Z0-9 ] |
* | 匹配前面子表达式0次或者多次 例:goo*d、go.*d |
\ {n \ } | 匹配前面的子表达式n次, 例: go{2}d、’[O-9]{2}'匹配两位数字 |
\ {n, \ } | 匹配前面的子表达式不少于n次, 例: go{2,}d、’ [0-9]{ 2, \ }'匹配两位及两位以上数字 |
\ {n,m \ } | 匹配前面的子表达式n到m次, 例: go{2,3)d、’[0-9]{2,3}'匹配两位到三位数字 |
注: egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加 “ \ ” |
[root@localhost home]# egrep -E -n 'wo{2}d' test.txt
8:a wood cross!
[root@localhost home]# egrep -E -n 'wo{2,3}d' test.txt
8:a wood cross!
12:#woood #
定位符
^ :匹配输入字符串开始的位置
$ :匹配输入字符串结尾的位置
非打印字符
\n :匹配一个换行符
\r :匹配一个回车符
\t :匹配一个制表符
[root@localhost ~]# grep -n '^t' test.txt
4:the tongue is boneless but it breaks bones.12!
[root@localhost ~]# grep -n 's$' test.txt
9:Actions speak louder than words
[root@localhost ~]# grep -E -n wo\{2\}d test.txt
8:a wood cross!
例:查看 test.txt 文件中 ,W后面有两个或多个O的单词
[root@localhost ~]# grep -E -n wo\{2,\}d test.txt
8:a wood cross!
12:#woood #
13:#woooooood
[root@localhost ~]# grep go[osad] test.txt
google is the best tools for search keyword.
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达 式的元字符主要包括以下几个:
元字符 | 作用 |
---|---|
+ | 重复一个或者一个以上的前一个字符 |
? | 零个或者一个的前一个字符 |
I(管道符) | 使用或者(or)的方式找出多个字符 |
() | 查找“组”字符串 |
()+ | 辨别多个重复的组 |
1.查找特定字符
查找特定字符非常简单,如执行以下命令即可从 test.txt 文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色
若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号
2.利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”
若要查找包含重复单个字符“oo”时,只需要执行以下命令即可
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[ ^ ]”来实现该目的。例如执行“grep -n‘[ ^w ]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串
在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知, “#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #”也符合匹配规则。
若不希望“oo”前面存在小写字母,可以使用
“grep -n‘[ ^a-z ]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示
查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现
3.查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“ ^ ”(行首)与“ $ ”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现
查询以小写字母开头的行可以通过“ ^ [a-z]”规则来过滤,查询大写字母开头的行则使用
“ ^ [A-Z]”规则,若查询不以字母开头的行则使用“^ [ ^a-zA-Z] ” 规则
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符
当查询空白行时,执行“grep -n‘^$’test.txt”命令即可
**4.查找任意一个字符 “ . ” 与重复字符 “ * ” **
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾
在上述结果中,“wood”字符串“w…d”匹配规则。若想要查询 oo、ooo、ooooo 等资料, 则需要使用星号()元字符。但需要注意的是,“”代表的是重复零个或多个前面的单字符。 “o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep
-n ‘o*’ test.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”,则第一个 o 必须存在, 第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准
若查询包含至少两个 o 以上的字符串,则执行“grep -n ‘ooo*’ test.txt”命令即可
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现
执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串
执行以下命令即可查询任意数字所在行
5.查找连续字符范围“{}”
使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示
查询两个 o 的字符
查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
注意:cut只擅长于处理单个字符为间隔的文本
格式:cut [选项] 参数
常用选项
选项 | 作用 |
---|---|
-b | 按字节截取 |
-c | 按字符截取,常用于中文 |
-d | 指定以什么为分隔符截取,默认为制表符 |
-f | 通常和-d一起 |
示例:
例1:截取passwd文件的第一列
例2:截取passwd文件的第一列和第三列
例3:截取passwd文件的第一列到第三列
例4:截取who查询结果的第三个字节
例5:截取name文件中的第一个文字
是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样
格式:sort [选项] 参数
常用选项
选项 | 作用 |
---|---|
-t | 指定分隔符,默认使用[Tab]吧 键或空格分隔 |
-k | 指定排序区域,哪个区间排序 |
-n | 按照数字进行排序,默认是以文字形式排序 |
-u | 等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功 |
-r | 反向排序,默认是升序,-r就是降序 |
-o | 将排序后的结果转存至指定文件 |
示例:
sort passwd.txt ###不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示
sort -n -t: -k3 passwd.txt ###以冒号为分隔符,以数字大小对第三列排序(升序)
sort -nr -t: -k3 passwd.txt ###以冒号为分隔符,以数字大小对第三列排序(降序)
sort -nr -t: -k3 passwd.txt -o passwd.bak ###将输结果不在屏幕上输出而是输出到passwd.bak文件
主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重
格式:uniq [选项] 参数
常用选项
选项 | 作用 |
---|---|
-c | 对重复的行进行计数 |
-d | 仅显示重复行 |
-u | 仅显示出现一次的行 |
示例:
例:创建一个水果类型的文件,一共9行内容
例1:统计重复行的次数,不连续的重复行他不算做重复行
例2:结合sort使用就是我们想要的效果
例3:结合sort使用,过滤出重复行
例4:结合sort使用,去重
例5:也可以直接用sort -u
示例:查看登陆用户
可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符
格式:用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
常用选项
选项 | 作用 |
---|---|
-d | 删除字符删除字符 |
-s | 删除所有重复出现的字符,只保留第一个 |
例1:将fruit文件中的小写a-z字母替换成大写的A-Z
例2:替换(是一 一对应的字母的替换)
例3:把替换的字符用单引号引起来,包括特殊字符
例4:多个字符替换成一个
例5:删除换行符
例6:对p字符去重,只保留第一个
shell正则表达式是生产中最多使用的密令,大家牢记!