加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:32:41 所属栏目:百科 来源:网络整理
导读:文本搜索:grep,根据用户指定的模式对目标进行过滤,显示被匹配到的行(标准的模式要"") 使用格式:grep 选项 模式 文件名 (与文件通配不一样,只要包含该模式即可,输出的就是一行) 选项及其作用: -o 仅显示匹配到的内容,不会整行输出 -v 把没有匹配到

文本搜索:grep,根据用户指定的模式对目标进行过滤,显示被匹配到的行(标准的模式要"")

使用格式:grep 选项 模式 文件名 (与文件通配不一样,只要包含该模式即可,输出的就是一行)

选项及其作用: -o 仅显示匹配到的内容,不会整行输出

-v 把没有匹配到的内容显示出来

-i 忽略匹配模式的大小写

-e 使用的是扩展的正则表达式

-A # 将匹配到的内容及其向下#行显示出来

-B # 将匹配到的内容及其向上#行显示出来

-C # 将匹配到的内容及其上下#行显示出来

模式:由一类字符书写的模式,其中有一些字符不表示字符字面的意思,而是标示通配功能

[root@localhosttmp]#grep"/bin/bash"/etc/passwd
root:x:0:0:root:/root:/bin/bash
mml:x:65530:0:klkjljk:/home/mml:/bin/bash
[root@localhosttmp]#grep-o"/bin/bash"/etc/passwd
/bin/bash
/bin/bash
[root@localhosttmp]#grep-v"/bin/bash"/etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
[root@localhosttmp]#grep-i"/BIN/bash"/etc/passwd
root:x:0:0:root:/root:/bin/bash
mml:x:65530:0:klkjljk:/home/mml:/bin/bash
[root@localhosttmp]#cat-n/etc/group
1bin:x:1:bin,daemon
2daemon:x:2:bin,daemon
3sys:x:3:bin,adm
4adm:x:4:adm,daemon
5tty:x:5:
[root@localhosttmp]#grep-C1"&;sys&;"/etc/group
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon

基本正则表达式的元字符:

. 匹配任意单个字符

[] 匹配指定集合内的任意单个字符

数字集合:[0-9];[:digit:] 小写字母集:[a-z];[:lower:] 大写字母集:[A-Z];[:upper:]

大小写字母集:[a-zA-Z];[:alpha:] 数字和大小写字母集:[0-9a-zA-Z];[[:alnum:]]

空白字符集[[:space:]]

[^]匹配集合外的任意单个字符

* 匹配其前面的字符任意次数

? 匹配其前面字符0次或一次

+ 匹配其前面字符至少一次

{m} 匹配其前面字符m次

{m,n} 匹配其前面字符出现至少m次,之多n次

位置锚定:^ 行首锚定

$ 行尾锚定

^$ 空白行,什么都没有,不是空格符

&; 词首锚定

&; 词尾锚定

分组: (需要分成一组的内容)

选择字符: |

继承上次命令的参数: esc+.

后项引用:“([0-9])([a-z])12” 以数字开头,小写字母结尾的词

在基本正则表达式中不能直接识别字符,需要“|”进行转义

练习:

1、显示/proc/meminfo文件中以大写或小写S开头的行:

[root@localhosttmp]#grep^[Ss]/proc/meminfo
SwapCached:0kB
SwapTotal:2031612kB
SwapFree:2031612kB
Shmem:228kB
Slab:36100kB
SReclaimable:11268kB
SUnreclaim:24832kB

2、显示/etc/passwd文件中其默认shell为/sbin/nologin的用户:

在文件/etc/passwd中,以“:”为分割,shell类型在第七字段,用户在第一字段,所以:

[root@localhosttmp]#grep"/sbin/nologin"/etc/passwd|cut-d:-f1
bin
daemon
adm
lp
mail
uucp
operator
games
gopher
ftp
(下面的也显示了shell类型)
[root@localhosttmp]#grep"/sbin/nologin"/etc/passwd|cut-d:-f1,7
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
mail:/sbin/nologin
uucp:/sbin/nologin
operator:/sbin/nologin
games:/sbin/nologin
gopher:/sbin/nologin
ftp:/sbin/nologin

3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;进一步仅显示上述结果中其ID号最大的用户:

[root@localhosttmp]#grep"/bin/bash$"/etc/passwd|sort-t:-k3|cut-d:-f1|tail-1
mml
[root@localhosttmp]#grep"/bin/bash$"/etc/passwd|sort-t:-k3|tail-3
root:x:0:0:root:/root:/bin/bash
mml:x:65530:0:klkjljk:/home/mml:/bin/bash

4、找出/etc/passwd文件中的一位数或两位数;

[root@localhosttmp]#grep--color"&;[0-9]&;|&;[0-9][0-9]&;"/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin
或者
[root@localhosttmp]#grep--color"(&;[0-9]&;)|(&;[0-9][0-9]&;)"/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin
或者
[root@localhosttmp]#grep--color"&;[0-9]{1,2}&;"/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
saslauth:x:499:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

[root@localhosttmp]#grep"^[[:space:]]+"/boot/grub/grub.conf
root(hd0,0)
kernel/vmlinuz-2.6.32-504.el6.x86_64roroot=/dev/mapper/VolGroup-lv_rootrd_NO_LUKSLANG=en_US.UTF-8rd_NO_MDrd_LVM_LV=VolGroup/lv_swapSYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=VolGroup/lv_rootKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquiet
initrd/initramfs-2.6.32-504.el6.x86_64.img

6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字

符的行;(可以分组"(^#[[:space:]]+[^[:space:]]+)",但不能锁定单词"&;^#[[:space:]]+[^[:space:]]+&;")

[root@localhosttmp]#grep"^#[[:space:]]+[^[:space:]]+"/etc/rc.d/rc.sysinit
#/etc/rc.d/rc.sysinit-runonceatboottime
#TakeninpartfromMiquelvanSmoorenburg'sbcheckrc.
#CheckSELinuxstatus
#Printatextbanner.
#Onlyreadthisonce.

7、找出netstat -tan命令执行结果中以'LISTEN'(后可有空白字符)结尾的行;

(注意次数)

[root@localhosttmp]#netstat-tan|grep"LISTEN[[:space:]]*$"
tcp000.0.0.0:220.0.0.0:*LISTEN
tcp00127.0.0.1:6310.0.0.0:*LISTEN
tcp00127.0.0.1:250.0.0.0:*LISTEN
tcp000.0.0.0:345400.0.0.0:*LISTEN
tcp000.0.0.0:1110.0.0.0:*LISTEN
tcp00:::22:::*LISTEN
tcp00::1:631:::*LISTEN
tcp00::1:25:::*LISTEN
tcp00:::45646:::*LISTEN
tcp00:::111:::*LISTEN
[root@localhosttmp]#netstat-tan|cat-e
ActiveInternetconnections(serversandestablished)$
ProtoRecv-QSend-QLocalAddressForeignAddressState$
tcp000.0.0.0:220.0.0.0:*LISTEN$
tcp00127.0.0.1:6310.0.0.0:*LISTEN$

8、添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名

和默认shell相同的用户;(注意模式的表达格式)

[root@localhosttmp]#useradd-s/sbin/nologinbash
[root@localhosttmp]#useradd-s/sbin/nologintestbash
[root@localhosttmp]#useradd-s/sbin/nologinbasher
[root@localhosttmp]#useradd-s/sbin/nologinnologin
[root@localhosttmp]#tail-5/etc/passwd
mml:x:65530:0:klkjljk:/home/mml:/bin/bash
bash:x:500:500::/home/bash:/sbin/nologin
testbash:x:501:501::/home/testbash:/sbin/nologin
basher:x:502:502::/home/basher:/sbin/nologin
nologin:x:503:503::/home/nologin:/sbin/nologin
[root@localhosttmp]#grep"^(&;[[:alpha:]]*&;).*1$"/etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:503:503::/home/nologin:/sbin/nologin

9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。

(观察其不同)

[root@localhosttmp]#grep-o--color".*(&;[[:lower:]]*&;).*1r"bb
helikehisliker
helovehislover
[root@localhosttmp]#grep--color'(&;[[:alpha:]]+&;).*1r'bb
helikehisliker;
helovehislover.

扩展正则表达式 命令格式:egrep 选项 模式 文件名

-o 仅显示匹配到的内容,不会整行输出

-v 把没有匹配到的内容显示出来

--color 加色显示匹配到的内容

-i 忽略匹配模式的大小写

-A #将匹配到的内容及其向下#行显示出来

-B #将匹配到的内容及其向上#行显示出来

-C #将匹配到的内容及其上下的#行显示出来

扩展正则表达式的元字符(与基本的基本相似):

. 匹配任意单个字符

[] 匹配指定集合内的任意单个字符

数字集合:[0-9];[:digit:] 小写字母集:[a-z];[:lower:] 大写字母集:[A-Z];[:upper:]

大小写字母集:[a-zA-Z];[:alpha:] 数字和大小写字母集:[0-9a-zA-Z];[[:alnum:]]

空白字符集[[:space:]]

[^]匹配集合外的任意单个字符

* 匹配其前面的字符任意次数

? 匹配其前面字符0次或一次

+ 匹配其前面字符至少一次

{m} 匹配其前面字符m次

{m,n} 匹配其前面字符出现至少m次,之多n次

位置锚定:^ 行首锚定

$ 行尾锚定

^$ 空白行,什么都没有,不是空格符

< 词首锚定

> 词尾锚定

分组: (需要分成一组的内容)

选择字符: |

继承上次命令的参数: esc+.

后项引用:“([0-9])([a-z])12” 以数字开头,小写字母结尾的词

扩展正则表达式可以直接识别字符,不需要“|”进行转义

基名:路径的最后一个(不管是目录还是文件)

dirname命令:获取路径名 basename命令:获取基名

练习10:显示当前系统上root、centos或user1用户的默认shell及用户名;

[root@localhosttmp]#grep"(^&;root&;|^&;centos&;|^&;user1&;)"/etc/passwd|cut-d:-f1,7
root:/bin/bash

练习11:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行;

[root@localhosttmp]#grep"(&;[[:alpha:]]+&;())"/etc/rc.d/init.d/functions
checkpid(){
daemon(){
killproc(){
pidfileofproc(){
pidofproc(){
status(){
success(){
failure(){
passed(){
warning(){
action(){
strstr(){
confirm(){

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读