linux学习---通配符与正则表达式

Posted 落阳٩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习---通配符与正则表达式相关的知识,希望对你有一定的参考价值。

通配符与正则表达式的区别:基本上解释就是通配符是系统命令使用,一般用来匹配文件名或者什么的用在系统命令中。而正则表达式是操作字符串,以行尾单位来匹配字符串使用的。

通配符

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符
常见的通配符如下:

*匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~“user” 用户user家目录
. 和 ~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 一个字母
[A-Z] 一个字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[^a-z] 匹配列表中的所有字符以外的字符

另外在linux中有些预定义的字符类表示:

[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

例:

[root@localhost date]# touch f{1..5}.txt
[root@localhost date]# ls
 f1.txt   f2.txt   f3.txt   f4.txt   f5.txt  
[root@localhost date]# ll f[1-5].txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f1.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f2.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f3.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f4.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f5.txt
[root@localhost date]# touch f{a..z}.txt
[root@localhost date]# touch f{A..Z}.txt
[root@localhost date]# ls
f1.txt  f5.txt  fD.txt  fH.txt  fL.txt  fP.txt  fT.txt  fX.txt  fb.txt  ff.txt  fj.txt  fn.txt  fr.txt  fv.txt  fz.txt
f2.txt  fA.txt  fE.txt  fI.txt  fM.txt  fQ.txt  fU.txt  fY.txt  fc.txt  fg.txt  fk.txt  fo.txt  fs.txt  fw.txt
f3.txt  fB.txt  fF.txt  fJ.txt  fN.txt  fR.txt  fV.txt  fZ.txt  fd.txt  fh.txt  fl.txt  fp.txt  ft.txt  fx.txt
f4.txt  fC.txt  fG.txt  fK.txt  fO.txt  fS.txt  fW.txt  fa.txt  fe.txt  fi.txt  fm.txt  fq.txt  fu.txt  fy.txt
[root@localhost date]# ll f[a-c].txt    #如果使用[]匹配大小写字母同时存在就会出现小写字母在前大写字母在后的格式匹配
-rw-r--r--. 1 root root 0 Nov 18 11:26 fA.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fB.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fa.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fb.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fc.txt
[root@localhost date]# ll f[shi].txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fh.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fi.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fs.txt
[root@localhost date]# ll f[^a-y].txt   #排除以f[a-y]开头的文件
-rw-r--r--. 1 root root 0 Nov 18 11:23 f1.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f2.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f3.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f4.txt
-rw-r--r--. 1 root root 0 Nov 18 11:23 f5.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fY.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fZ.txt
-rw-r--r--. 1 root root 0 Nov 18 11:26 fz.txt

练习:

1、显示/etc目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录列表

[root@localhost etc]#ls -d /etc/l*[[:digit:]]*[[:lower:]]

2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录列表

[root@localhost etc]#ls -d /etc/[[:digit:]]*[^[:digit:]]

3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录列表

[root@localhost etc]#ls -d /etc/[^[:alpha:]][[:alpha:]][[:alnum:][:punct:]]*

4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录列表

[root@localhost etc]#ls -d /etc/rc[0-6][[:alnum:][:punct:]]*

5、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录列表

[root@localhost etc]# ls -d /etc/[mnrp]*.conf

6、只显示/root下的隐藏文件和目录列表

[root@localhost etc]# ls -d /root/.*

7、只显示/etc下的非隐藏目录列表

[root@localhost etc]# ls -d /etc/*

正则表达式

Regular Expressions(正则表达式),由一类特殊的字符及文本字符所编写的模式,其中有些字符不表示字符本身的含义,而表示控制或者通配的功能,但与通配符不同,通配符主要用来处理文件名,正则表达式则是处理文本内容中的字符

正则表达式分俩类

​ 基本正则表达式:BRE Basic Regular Expressions

​ 扩展正则表达式:ERE Extended Regular Expressions

正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组

基本正则表达式

字符匹配

. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

匹配次数

* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\\? #匹配其前面的字符出现0次或1次,即:可有可无
\\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\\{n\\} #匹配前面的字符n次
\\{m,n\\} #匹配前面的字符至少m次,至多n次
\\{,n\\} #匹配前面的字符至多n次,<=n
\\{n,\\} #匹配前面的字符至少n次

例:取出IP地址

[root@localhost /]# ifconfig ens160 | grep -o [0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\} | head -n1

位置锚定

^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\\< 或 \\b #词首锚定,用于单词模式的左侧
\\> 或 \\b #词尾锚定,用于单词模式的右侧
\\<PATTERN\\> #匹配整个单词
#注意: 单词是由字母,数字,下划线组成

例:排除空行及带#号的行

[root@centos8 ~]#grep -v ^$ /etc/profile|grep -v ^#
[root@centos8 ~]#grep ^[^$#] /etc/profile

分组

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \\1, \\2, \\3, ...
\\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

[root@localhost /]# cat /proc/meminfo | grep  "^[S,s]"
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              8868 kB
Slab:             131960 kB
SReclaimable:      67976 kB
SUnreclaim:        63984 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
[root@localhost /]# grep -i ^s /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              8868 kB
Slab:             131960 kB
SReclaimable:      67976 kB
SUnreclaim:        63984 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
[root@localhost /]# 

2、显示/etc/passwd文件中不以/bin/bash结尾的行

[root@localhost /]# cat /etc/passwd | grep  -v /bin/bash$

3、显示用户rpc默认的shell程序

 [root@localhost /]#grep “^rpc\\>”   /etc/passwd  | cut -d : -f7

4、找出/etc/passwd中的两位或三位数

[root@localhost /]# cat /etc/passwd | grep -o \\<[0-9]\\{2,3\\}\\>

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行

[root@localhost /]# grep ^[[:space:]]\\+[^[:space:]] /etc/grub2.cfg 

6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

[root@localhost /]# netstat -tan | grep \\<LISTEN\\>[[:space:]]*$
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
[root@localhost /]# netstat -tan | grep \\<LISTEN\\>[[:space:]]\\+$
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
[root@localhost /]# 

7、显示CentOS7上所有UID小于1000以内的用户名和UID

[root@localhost /]# cat /etc/passwd |cut -d: -f1,3|grep \\<[0-9]\\{1,3\\}\\>
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
dbus:81
systemd-coredump:999
systemd-resolve:193
tss:59
polkitd:998
unbound:997
sssd:996
chrony:995
sshd:74

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行

[root@localhost /]# cat /etc/passwd |grep ^\\(.*\\)\\>.*\\/\\1$

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

[root@localhost /]# df | grep -o \\<[0-9]\\{1,3\\}\\>% | sort -nr
17%
3%
1%
1%
0%
0%
0%
0%
[root@localhost /]# 

扩展正则表达式

字符匹配

. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

次数匹配

* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次

位置锚定

^ 行首
$ 行尾
\\<, \\b 语首
\\>, \\b 语尾

分组

() 分组
后向引用:\\1, \\2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

[root@localhost /]# ifconfig ens160 | grep -Eo [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3} | head -n1
192.168.1.44
[root@localhost /]# ifconfig ens160 | grep -o [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3} | head -n1
[root@localhost /]# 

练习

1、显示三个用户root、mage、wang的UID和默认shell

[root@localhost /]# grep -E ^(wang|root|mage)\\> /etc/passwd | cut -d : -f1,3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

[root@localhost /]# grep -E ^[[:alpha:]_]*\\(\\) /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

[root@localhost /]# echo /etc/rc.d/init.d/functions | grep -E -o "[^/]+/?$"
functions

4、使用egrep取出上面路径的目录名

[root@localhost /]# echo /etc/rc.d/init.d/functions | grep -E -o "^/.*/"

5、统计last命令中以root登录的每个主机IP地址登录次数

[root@localhost /]# last | grep -E ^root\\>|tr -s " "|cut -d " " -f3|uniq -c

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

[root@localhost /]# grep -E \\<[0-9]\\>
[root@localhost /]# grep -E \\<[0-9]{2}\\>
[root@localhost /]# grep -E 2[0-4][0-9]
[root@localhost /]# grep -E 22[0-5]

7、显示ifconfig命令结果中所有IPv4地址

[root@localhost /]# ifconfig |grep -o -E [0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+

8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

[root@localhost /]# echo welcome to magedu linux | grep -o [[:alnum:]] |sort -n|uniq -c | sort -r

以上是关于linux学习---通配符与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

老男孩Linux运维第41期20171016第六周学习重点课堂记录

linux通配符

正则表达式与Linux通配符

linux通配符与正则表达式

Linux正则表达式与通配符

Linux运维学习笔记-通配符及正则表达式知识总结