正则表达式之――grep
正则表达式定义:
使用一类元字符(不表示本身意义,而表示通配或其它意义),组合其他字符,所描述出来的,能能够匹配符合条件的字符
正则表达式的分类:
基本正则表达式:grep
扩张正则表达式:egrep
正则表达式元字符集和及其意义
符号 |
意义 |
* |
匹配紧挨在其前面的字符0次或多次重复 |
. |
匹配单个字符 |
.* |
匹配任意长度字符 |
^ |
锚定行首的符合条件的内容 |
& |
锚定行尾的符合条件的内容 |
^$ |
空白行 |
{m,n} |
匹配前面字符出现了m-n次 |
{0,n} |
匹配前面字符至多出现n次 |
{m,} |
匹配前面字符至少出现m次 |
{m} |
匹配前面字符出现了m次 |
&;
|
锚定词首 |
&; |
锚定词尾 |
&;&; |
锚定单词 |
() |
分组 |
[] |
匹配指定范围内的任意单个字符 |
[^] |
匹配指定范围外的任意单个字符 |
? |
匹配紧挨在其前面的字符0次或1次 |
+
|
匹配其前面的字符至少1次 |
| |
或 |
grep 的选项及其意义
选项 |
意义 |
--color |
添加颜色 |
-v |
反向选取,只显示不符合模式的行 |
-o |
只显示被模式匹配到的字串,而不是整个行; |
-i |
不区分字符大小写; |
-A # |
显示匹配到的行时,顺带显示其后面的#个行; |
-B # |
显示匹配到的行时,顺带显示其前面的#个行; |
-C # |
显示匹配到的行时,顺带显示其前后面的#个行; |
-E |
使用扩展正则表达式 |
grep支持字符和字符集合
字符 |
意义 |
[:digit:] |
所有数字,相当于0-9 或者d |
[:lower:] |
所有的小写字母 |
[:upper:] |
所有的大写字母 |
[:alpha:] |
所有的字母 |
[:alnum:] |
相当于[0-9a-zA-Z] |
[:space:] |
空白字符 相当于s |
[:punct:] |
所有标点符号 |
S |
匹配任何非空白字符。与 [^ fnrtv] 等效 |
w |
匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。 |
W |
与任何非单词字符匹配。与“[^A-Za-z0-9_]”等效。 |
正则表达式举例说明:
(1) 查找/etc/passwd 中以root开头的行
1
2
3
|
[root@localhost /]# grep
"^root"
/etc/passwd
root:x:
0
:
0
:root:/root:/bin/bash
[root@localhost /]#
|
(2) 查找/etc/passwd 中以“/bin/bash”结尾的行
1
2
3
4
5
|
[root@localhost /]# grep
"/bin/bash$"
/etc/passwd
root:x:
0
:
0
:root:/root:/bin/bash
mandriva:x:
4004
:
501
::/home/mandriva:/bin/bash
mysql:x:
495
:
2004
::/home/mysql:/bin/bash
[root@localhost /]#
|
(3)查找/etc/passwd中以r开头以h结尾中间任意字符的行
1
2
3
|
[root@localhost /]# grep
"^r.*h$"
/etc/passwd
root:x:
0
:
0
:root:/root:/bin/bash
[root@localhost /]#
|
(4)查找/etc/passwd中包括ro或者root的行(使用{1,2}p)
1
2
3
4
5
|
[root@localhost /]# grep
"ro{1,2}"
/etc/passwd
root:x:
0
:
0
:root:/root:/bin/bash
operator:x:
11
:
0
:operator:/root:/sbin/nologin
rtkit:x:
499
:
497
:RealtimeKit:/proc:/sbin/nologin
[root@localhost /]#
|
(5)查找/etc/passwd 中精确匹配rpc的行 (rpc)
1
2
3
4
5
6
|
[root@localhost /]# grep
"rpc"
/etc/passwd 查找rpc的行
rpc:x:
32
:
32
:Rpcbind Daemon:/
var
/cache/rpcbind:/sbin/nologin
rpcuser:x:
29
:
29
:RPC Service User:/
var
/lib/nfs:/sbin/nologin
[root@localhost /]# grep
"&;rpc&;"
/etc/passwd 精确匹配rpc的行
rpc:x:
32
:
32
:Rpcbind Daemon:/
var
/cache/rpcbind:/sbin/nologin
[root@localhost /]#
|
(6)显示/proc/meminfo文件中以不区分大小的s开头的行;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@localhost /]# grep
"[Ss]"
/proc/meminfo
Buffers:
47272
kB
SwapCached:
0
kB
SwapTotal:
2097144
kB
SwapFree:
2097144
kB
AnonPages:
43056
kB
Shmem:
252
kB
Slab:
97532
kB
SReclaimable:
71464
kB
SUnreclaim:
26068
kB
KernelStack:
1400
kB
PageTables:
4736
kB
NFS_Unstable:
0
kB
Committed_AS:
154500
kB
VmallocUsed:
276328
kB
AnonHugePages:
2048
kB
HugePages_Total:
0
HugePages_Free:
0
HugePages_Rsvd:
0
HugePages_Surp:
0
Hugepagesize:
2048
kB
[root@localhost /]#
|
或者使用 grep -i 选项
(7)显示/var/log/secure文件中包含“Failed password”或“FAILED LOGIN”的行;
1
2
3
|
[root@localhost /]# grep -E
"Failed password | FAILED LOGIN"
/
var
/log/secure
Jul
14
14
:
01
:
52
localhost sshd[
2950
]: Failed password
for
root from
172.16
.
254.22
port
57650
ssh2
[root@localhost /]#(
|
(8)在cat.sh中使用(|)搜索cat,Cat
 (9)在/proc/meminfo中查找以S开头后面跟一个字符的行
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost /]# grep
"^S."
/proc/meminfo
SwapCached:
0
kB
SwapTotal:
2097144
kB
SwapFree:
2097144
kB
Shmem:
252
kB
Slab:
97544
kB
SReclaimable:
71468
kB
SUnreclaim:
26076
kB
[root@localhost /]# grep
"^S..b"
/proc/meminfo
Slab:
97536
kB
[root@localhost /]#
|
正则表达式与grep选项配合使用举例:
1). 显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@localhost /]# grep
"^#[[:space:]]{1,}[^[:space:]]"
/etc/rc.d/rc.sysinit
# /etc/rc.d/rc.sysinit - run once at boot time
# Taken
in
part from Miquel van Smoorenburg's bcheckrc.
# Check SELinux status
# Print a text banner.
# Only read
this
once.
# Initialize hardware
# Set
default
affinity
# Load other user-defined modules
# Load modules (
for
backward compatibility
with
VARs)
# Configure kernel parameters
# Set the hostname.
# Sync waiting
for
storage.
|
2).显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n
1
2
3
4
5
6
7
8
9
10
|
[root@localhost /]# grep --color=auto
".n.*.n"
/etc/rc.d/rc.sysinit
# /etc/rc.d/rc.sysinit - run once at boot time
# Taken
in
part from Miquel van Smoorenburg's bcheckrc.
HOSTNAME=$(/bin/hostname)
if
[ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
if
[ -z
"$HOSTNAME"
-o
"$HOSTNAME"
=
"(none)"
]; then
if
[ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/
null
2
>&
1
|
3).显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n,但后面的n之前的字符要与前面的n之前的字符相同;
1
2
3
4
5
6
7
8
|
[root@localhost /]# grep --color=auto
"(.n).*1"
/etc/rc.d/rc.sysinit
# Taken
in
part from Miquel van Smoorenburg's bcheckrc.
mount -n -o remount /dev/shm >/dev/
null
2
>&
1
if
[ -e
"/selinux/enforce"
] && [
"$(cat /proc/self/attr/current)"
!=
"kernel"
]; then
if
[ -r
"/selinux/enforce"
] ; then
echo $
"*** Warning -- SELinux is active"
echo $
"*** Disabling security enforcement for system recovery."
echo $
"*** Run 'setenforce 1' to reenable."
|
4).查看电话号码
1
2
3
4
5
6
7
8
9
10
|
[root@localhost /]# cat > phone.txt << EOF
0511
-
440533
0212
-
7878909
0313
-
99797780
23937974320432840324894820
EOF
[root@localhost /]# grep -E
"[0-9]{3}-[0-9]{8}|[0-9]{4}-[0-9]{7}"
phone.txt
0212
-
7878909
0313
-
99797780
[root@localhost /]#
|
5).匹配邮件地址
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost /]# cat > email.txt << EOF
> 903U948HH@qq.com
> wejojodffslf@
126
.com
> 3joefjowfmfj@
163
.com
> dfk;dkf;f;;wkererm
> EOF
[root@localhost /]# grep -E
"w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"
email.txt
903U948HH@qq.com
wejojodffslf@
126
.com
3joefjowfmfj@
163
.com
[root@localhost /]#
|
总结:
1、* # ? 的比较:
*:匹配其前一个字符0次或多次
#:匹配其前一个字符1次或多次
?:匹配其前一个字符0次或1次
2、‘’ “” ``的比较:
“”:弱引用,可以实现变量替换
'':强引用,不替换,而显示字符本身;
``:命令引用,``<--->$() (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|