RHCE:通过grep使用正则表达式

 RHCE:通过grep使用正则表达式:



查找文本文件的内容的行(只能匹配数据的行)

grep语法:

grep [options] parrern  filename

 

[root@foundation0 grep]# cat grep.txt

abc

bcd

test

grepa

ba

b2

 

 

-c  只输出匹配行的计数

[root@foundation0 grep]# grep -c a grep.txt

3

 

-i  不区分大小写 忽略大小写

[root@foundation0 grep]# grep  -i "^a.*y$" grep.txt

Ay

Ammmy

Ammy

 

-h  查询多文件时不显示文件名

[root@foundation0 ~]# grep -h root /etc/passwd /etc/group

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

root:x:0:

 

-s  如果没有匹配到则不显示,错误信息不显示

[root@foundation0 grep]# grep -s a grep.txt

abc

grepa

ba

[root@foundation0 grep]# grep -s efg grep.txt

[root@foundation0 grep]# echo $?

1

[root@foundation0 grep]# grep -s efg grep #输入了错误的文件名,通过使用-s 就不会报错

[root@foundation0 grep]#

 

-w 精确匹配

[root@foundation0 grep]# ip a | grep  -w  inet #只匹配有一个单词的这一行,是因为匹配了这个单词,所有匹配了这一行

    inet 127.0.0.1/8 scope host lo

 

-v 取反,匹配与正则表达式相反的行

[root@foundation0 grep]# cat grep.txt

abc

bcd

test

grepa

ba

b2

[root@foundation0 grep]# grep -v^b grep.txt

abc

test

grepa

 

[root@foundation0 grep]# grep [0-9] grep.txt

b2#因为匹配了数字2,所以显示了这一行

089

123

3456

2b

[root@foundation0 grep]# grep -v [0-9] grep.txt  #匹配不是数字的行

abc

bcd

test

grepa

ba

AxyzxyzxyzxyzxyzC

Zmmmmmmmmmmy

Ay

Ammmy

xyz

abc

Ammy

bd

 

 

 

-Anum  显示匹配行的下num

[root@node230 grep]# grep -A1 "^a" grep.txt

abc

bcd

[root@node230 grep]# grep -A2 "^a" grep.txt

abc

bcd

Test

 

-Bnum  显示匹配行的上num

[root@foundation0 grep]# grep -B1  test grep.txt

bcd

test

 

-Anum   -Bnum 显示匹配行的上num行和下num

[root@foundation0 grep]# grep -A1 -B1  test grep.txt

bcd

test

grepa

 

-C num [-Cnum] 显示匹配行的上num行和下num

[root@node230 grep]# grep -C 1 "^g" grep.txt

test

grepa

ba

[root@node230 grep]# grep -C 2 "^g" grep.txt

bcd

test

grepa

ba

b2

 

^pattern 匹配以pattern开头的行

[root@foundation0 grep]# grep "^b" grep.txt

bcd

ba

b2

 

pattern$ 匹配以pattern结尾的行

[root@foundation0 grep]# grep "d$" grep.txt

bcd

 

. 匹配任意单个字符

[root@foundation0 grep]# grep "." grep.txt

abc

bcd

test

grepa

ba

b2

 

* :匹配任意长度的单个字符,.代表任意单个字符,*表示重复前面字符的0次或多次,*号前面一定要有字符或数字,*号前的可以是字符,也可以是字符组成的组(.*)*只对它前面的一个字符或组起作用,再前面的字符不受影响

[root@foundation0 grep]# grep ".*" grep.txt

abc

bcd

test

grepa

ba

b2

 

 

[pattern] 匹配指定范围内的任一一个字符

[root@foundation0 grep]# grep [Ay] grep.txt #匹配A 或者y 或者Ay

Ay

Ammmy

Ammy

[root@foundation0 grep]# grep [0-9x-zX-z] grep.txt #包含开头和结尾的字符

b2

AxyzxyzxyzxyzxyzC

Zmmmmmmmmmmy

Ay

Ammmy

089

xyz

Ammy

 

[^pattern]:指定匹配范围外的字符,也就是不匹配显示的字符,的意思

[root@foundation0 grep]# grep [^1-3] grep.txt  #不包含数字123

abc

bcd

test

grepa

ba

b2

AxyzxyzxyzxyzxyzC

Zmmmmmmmmmmy

Ay

Ammmy

089

xyz

abc

Ammy

 

^[pattern]pattern开头的行:

[root@foundation0 grep]# grep ^[0-9] grep.txt

089

 

POSIX格式:

[[:alpha:]] 匹配字母字符

[[:lower:]] 匹配小写字母字符

[[:upper:]] 匹配大写字母字符

[[:digit:]] 匹配数字

[[:alnum:]] 匹配字母数字字符

[[:space:]] 匹配空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符

[[:punct:]] 匹配标点字符

[[:cntrl:]] 匹配控制字符(禁止打印)

[[:print:]] 匹配可打印字符

 

? 表示匹配前面字符0次或1\?

[root@foundation0 grep]# grep "b\?d" grep.txt

bcd

Bd

 

[root@foundation0 grep]# echo "za" | grep "z\(a\?\)"

Za

 

[root@foundation0 grep]# grep "Am\?y" grep.txt   #基础正则表达式,要加转意字符\

Ay

 

[root@foundation0 grep]# grep "Am?y" grep.txt

[root@foundation0 grep]# grep -E "Am?y" grep.txt  #扩展正则表达式,相当于egrep "Am?y" grep.txt

Ay

 

[root@foundation0 grep]# grep "A\(m\)\?y" grep.txt  #只重复前面括号内的字符0次或1

Ay

 

""匹配所有任意字符

[root@foundation0 grep]# grep "" grep.txt

abc

bcd

test

grepa

ba

 

 

{m,n}匹配前面的字符串从mn次的行

[root@foundation0 grep]# grep "Zm\{3,10\}y" grep.txt

Zmmmmmmmmmmy

[root@foundation0 grep]# grep -E "Zm{3,10}y" grep.txt

Zmmmmmmmmmmy

[root@foundation0 grep]# grep -E 'Zm{3,10}y' grep.txt

Zmmmmmmmmmmy

 

 

{n,}匹配前面的字符串至少n次的行,包含n,相关于>=n

[root@node230 grep]# grep -E "Zm{3,}y" grep.txt

Zmmmmmmmmmmmmmmmmy

 

{,n}匹配前面的字符串至多n次的行,包含n次,相关于<=n

[root@node230 grep]# grep -E "Am{,3}y" grep.txt

Ay

Ammmy

Ammy

[root@node230 grep]# grep -E "Am{,2}y" grep.txt

Ay

Ammy

 

()分组匹配几次前面组的行,括号内指定的组重复的次数

[root@foundation0 grep]# grep -E  "A(xyz){5}C"  grep.txt

AxyzxyzxyzxyzxyzC

[root@foundation0 grep]# grep -E  "A(xyz){5,5}C"  grep.txt

AxyzxyzxyzxyzxyzC

[root@foundation0 grep]# grep -E  "A(xyz){1,}C"  grep.txt

AxyzxyzxyzxyzxyzC

 

\<pattern为开头,以\>结尾的行

[root@foundation0 grep]# grep -E "\<A.*C\>" grep.txt

AxyzxyzxyzxyzxyzC

[root@foundation0 grep]# grep -E "^A.*C$" grep.txt

AxyzxyzxyzxyzxyzC

[root@foundation0 grep]# grep "^[a-z]a$" grep.txt

ba

 

 

+ 表示匹配前面的字符串一次或多次

[root@foundation0 grep]# echo "redhat" | grep -E "(re)(d+)"

redhat

[root@foundation0 grep]# grep -E "A(xyz)+C" grep.txt

AxyzxyzxyzxyzxyzC

 

 

| 表示或关系  \|

[root@foundation0 grep]# grep -E "vmx|svm" /proc/cpuinfo

flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts

 

mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology

 

tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe

 

popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch ida arat pln pts dtherm tpr_shadow

 

vnmi ept vpid fsgsbase smep

 

 

对以上配置的总结:

.匹配字符

 

.    匹配任意单个字符

 

[ ]  匹配指定范围内的任意字符

 

[^]  匹配飞指定范围内的任意字符

 

[:alpha:] 字母字符

 

[:lower:] 小写字母字符

 

[:upper:] 大写字母字符

 

[:digit:] 数字

 

[:alnum:] 字母数字字符

 

[:space:] 空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符

 

[:punct:] 标点字符

 

[:cntrl:] 控制字符(禁止打印)

 

[:print:] 可打印字符

 

使用时一般使用两个中括号,具体会在下面的例子中使用。

 

.匹配次数

 

*      匹配前面的字符任一次

 

.*    匹配任意长度的任意字符(注意贪婪模式,比如  grep  r.*t/etc/passwd  

 

x\{m,n\}  指定前面的字符至少出现m次,至多出现N次。

 

x\{m,\}    指定前面的字符至少出现m

 

x\{0,n\}  指定前面的字符至多出现N

 

x\{m\}    精确匹配m

 

?        匹配其前面的字符01

 

.锚定符

 

1.^  锚定行首    grep  "^r..t"  /etc/passwd

 

2.$  锚定行尾    grep  "h$"  /etc/passwd

 

3.^$ 锚定空白行  grep  "^$"  /etc/passwd

 

4.\< (\b)  锚定词首    grep  "\<r..t"  /etc/passwd

 

5.\> (\b)  锚定词首    grep  "r..t\>"  /etc/passwd

 

示例(容易混淆):

 

至少包含一个空白字符          grep  "[[:space:]]\{1,\}"  /etc/passwd

 

至少包含一个非空白字符        grep  "[^[:space:]]\{1,\}"  /etc/passwd

 

没有一个空白字符              grep  -v "[^[:space:]]\{1,\}"  /etc/passwd

 

6.\(\)对字符分组  grep  "\(l..e\).*\1r"

 

示例:

 

grep --color "l\([13]\):\1:.*:\1"  /etc/inittab

 

.选项

 

-v    对结果取反

 

-i    忽略字母大小写

 

-o    仅显示匹配到的字符串(行的其他内容不显示)

 

-E    支持扩展的正则表达式

 

-A n    显示匹配到的行下面n

 

-B n    显示匹配到的行上面n

 

-C n    显示匹配到的行上下面各显示n

 


分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS