通配符与正则表达式元字符的理解及grep的实例应用

前端之家收集整理的这篇文章主要介绍了通配符与正则表达式元字符的理解及grep的实例应用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


什么是通配符(glob)?

通配符是Linuxshell中用来描述(匹配)不确定字符的特殊符号.

看看具体通配符是如何描述字符?

*代表任意字符任意次数
?代表任意单个字符0次或者1次
[]代表括号中存在的任意单个字符
[!]代表非括号中存在的任意单个字符
[^]代表指定范围外的任意单个字符
[a-z]代表所有单个小写字母
[A-Z]代表所有单个大写字母
[:digit:]代表所有单个数字
[:upper:]代表所有单个大写字母
[:lower:]代表所有单个小写字母
[:alpha:]代表所有单个字母
[:blank:]代表水平空格或tab键
[:space:]代表空格
[:punct:]代表标点符号
[:xdigit:]代表十六进制
通配符 * 的应用:
[root@localhostrc.d]#ls#列出此目录下的所有内容
init.drc0.drc2.drc4.drc6.drc.sysinit
rcrc1.drc3.drc5.drc.local
[root@localhostrc.d]#lsrc.*#列出此目录下所有以rc.开头任意长度字符结尾的文件
rc.localrc.sysinit
通配符 ? 的应用:
[root@localhostrc.d]#lsr?#列出以r开头后面紧跟任意单个字符结尾,可与*对照之
rc
通配符 [ ] 的应用:
[root@localhostrc.d]#mkdirb#创建目录b
[root@localhostrc.d]#ls#查看目录内容
brcrc1.drc3.drc5.drc.local
init.drc0.drc2.drc4.drc6.drc.sysinit
[root@localhostrc.d]#ls-d[ib]*#以i或者b开头的目录
binit.d
注意的是:[[?*\]指的是匹配"[","?","\","三个字符中的一个并不代表通配符
[][!]指的同样也是中间的三个字符
通配符 [!] 的应用:
[root@localhostrc.d]#ls-d[!ib]*#i或者b开头的目录
rcrc0.drc1.drc2.drc3.drc4.drc5.drc6.drc.localrc.sysinit
通配符 [^] 的应用:
效果与[!]相同
通配符 [:alpha:] 的应用
效果类似于[]基本相似,只不过匹配内容是描述符所描述的含义

与shell中通配符不同的有另一种描述符?

正则表达式中字符可分为两种:文本字符和元字符.
正则表达式分为基本正则表达式和扩展正则表达式.

*centos 正则表达式的支持依赖于perl PCRE模块.

元字符(Metacharacter):在正则表达式中具有特殊意义的字符,使得正则表达式具有文件处理能力.

1.描述字符本身
\转义字符(跳脱字符)其后的字符还原为本来的含义,不做特殊字符
.代表任意单个字符
[]代表括号中指定的任意单个字符
[^]代表除括号中指定的任意单个字符
[:alnum:]代表所有的数字和字母中的任意单个字符
[:digit:]代表所有数字中的任意单个字符
[:alpha:]代表所有英文字母中的任意单个字符
[:lower:]代表所有小写英文字母中的任意单个字符
[:upper:]代表所有大写英文字母中的任意单个字符
[:space:]代表空格
[:punct:]代表标点符号
[:blank:]代表水平空格或tab键
2.描述字符出现次数
基本正则:
*代表前面单个字符或字符串(分组)出现任意次
\?代表前面单个字符或字符串(分组)出现零次或一次
\+代表前面单个字符或字符串(分组)出现至少一次
\{n\}代表前面单个字符或字符串(分组)出现n次
\{m,n\}代表前面单个字符或字符串(分组)至少出现m次至多出现n次
\{m,\}代表前面单个字符或字符串(分组)至少出现m次多则不限
\{,n\}代表前面单个字符或字符串(分组)至多出现n次少则不限
扩展正则:
*代表前面单个字符或字符串(分组)出现任意次
?代表前面单个字符或字符串(分组)出现零次或一次
+代表前面单个字符或字符串(分组)出现至少一次
{n}代表前面单个字符或字符串(分组)出现n次
{m,n}代表前面单个字符或字符串(分组)至少出现m次至多出现n次
{m,}代表前面单个字符或字符串(分组)至少出现m次多则不限
{,n}代表前面单个字符或字符串(分组)至多出现n次少则不限
3.描述字符的位置(位置锚定)
^代表以紧跟其后的字符开头的行
$代表以紧跟其后的字符结尾的行
\<代表以紧跟其后的字符或字符串做单词的开头
\>代表以紧跟其后的字符或字符串做单词的结尾
\<\>代表以中间字符或字符串为整个单词
\b\b是\c\>的另一种表示方法
分组()多个字符括起来作为一个整体字符串使用
几个常用组合:
^$代表空行
.*代表任意字符出现任意次

grep 命令简单用法:搜索文本中的所需的关键字

grep[OPTIONS]PATTERN[FILE...]
grep[OPTIONS][-ePATTERN|-fFILE][FILE...]
-i忽略关键字大小写
-n显示搜索到的内容在原文件中的行
-v取反显示;显示没有匹配到的行
-c显示匹配到内容多少行
-o仅显示匹配到的字符串
-An显示匹配到的内容的行及后n行
-Bn显示匹配到的内容的行及前n行
-Cn显示匹配到的内容的行及前后n行
-e指定多个关键字
grep-e"root"-e"ntp"/etc/passwd
-w显示匹配到内容的单词数
-E使用扩展的正则表达式相当于egrep
元字符的应用:

1.去掉/etc/rc.d/rc.local中的#开头和空行?

[root@localhostrc.d]#catrc.local
#!/bin/sh
#
#Thisscriptwillbeexecuted*after*alltheotherinitscripts.
#Youcanputyourowninitializationstuffinhereifyoudon't
#wanttodothefullSysVstyleinitstuff.

touch/var/lock/subsys/local
[root@localhostrc.d]#catrc.local|egrep-v^$|grep-v^#
touch/var/lock/subsys/local
简化:
[root@localhostrc.d]#catrc.local|grep-v-E"^#|^$"
touch/var/lock/subsys/local

2.取出ifconfig的ip地址

[root@localhostrc.d]#ifconfig|egrep-o-E\([0-2]?[0-9]?[0-9]\.\){3}[0-9]+|head-1
172.16.253.171
简化:
[root@localhostrc.d]#ifconfig|egrep-o"([0-9]+\.){3}[0-9]+"|head-1
172.16.253.171
另一种方法:
[root@localhostrc.d]#ifconfig|grep"inetaddr"|cut-d:-f2|cut-d""-f1|
head-1
172.16.253.171

3.找出/etc/passwd中用户名与shellming相同的?

[root@localhostrc.d]#cat/etc/passwd|grep--color=auto-E"(^[[:alnum:]]+):.*\1$"
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

4.找出/var目录下所有的以.log结尾的文件所在路径?

[root@localhostrc.d]#find/var-name*.log|grep-o-E"/.*/"|uniq
/var/log/audit/
/var/log/gdm/
/var/log/tuned/
/var/log/anaconda/
/var/log/
/var/log/mariadb/
/var/log/

5.找出/var目录下所有的以.log结尾的文件所在基名?

[root@localhostrc.d]#find/var-name*.log#查找出/var下所有的.log结尾的文件
/var/log/audit/audit.log
/var/log/gdm/:1.log
/var/log/gdm/:0-greeter.log
/var/log/gdm/:0.log
/var/log/tuned/tuned.log
/var/log/anaconda/anaconda.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
/var/log/anaconda/packaging.log
/var/log/anaconda/storage.log
/var/log/anaconda/ifcfg.log
/var/log/anaconda/ks-script-jwlu_8.log
/var/log/anaconda/journal.log
/var/log/vmware-vmsvc.log
/var/log/Xorg.9.log
/var/log/wpa_supplicant.log
/var/log/yum.log
/var/log/vmware-vmusr.log
/var/log/mariadb/mariadb.log
/var/log/Xorg.0.log
/var/log/pm-suspend.log
/var/log/pm-powersave.log
/var/log/boot.log
[root@localhostrc.d]#find/var-name*.log|grep-o-E"[^/]*$"#正则取出基名
audit.log
:1.log
:0-greeter.log
:0.log
tuned.log
anaconda.log
X.log
program.log
packaging.log
storage.log
ifcfg.log
ks-script-jwlu_8.log
journal.log
vmware-vmsvc.log
Xorg.9.log
wpa_supplicant.log
yum.log
vmware-vmusr.log
mariadb.log
Xorg.0.log
pm-suspend.log
pm-powersave.log
boot.log

6、找出/proc/meminfo文件中,所有以大写或小写s开头的行,两种方式:

[root@localhostrc.d]#cat/proc/meminfo|grep-E"^[s|S].*"
SwapCached:0kB
SwapTotal:2097148kB
SwapFree:2097148kB
Shmem:9132kB
Slab:148756kB
SReclaimable:88588kB
SUnreclaim:60168kB
[root@localhostrc.d]#cat/proc/meminfo|egrep-i"^s.*"
SwapCached:0kB
SwapTotal:2097148kB
SwapFree:2097148kB
Shmem:9132kB
Slab:148756kB
SReclaimable:88588kB
SUnreclaim:60168kB

7.检索出不以/sbin/nologin为shell的用户,并显示用户信息在原文件中的行号?

[root@localhost~]#egrep-n-v"\</sbin/nologin$"/etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt

8.检索shutdown用户,并显示上下1行的内容?

[root@localhostlogs]#egrep-C1"^shutdown"/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

9.检索出属主ID(UID),属组ID(GID)相同的用户?

[root@localhostlogs]#egrep"\<([0-9]+)\>:\1"/etc/passwd|cut-d:-f1
root
bin
daemon
nobody
systemd-bus-proxy
systemd-network
dbus
abrt
tss
rpc
usbmuxd

如有任何错误请多多指教

“老城小叙“的个人博客:http://cityx.blogcitys.com

原文链接:https://www.f2er.com/regex/358428.html

猜你在找的正则表达式相关文章