当前位置:   article > 正文

Day17-正则表达式

Day17-正则表达式

双引号使用:
grep oldboy /etc/passwd
grep “oldboy” /etc/passwd

echo oldgirl
echo “oldgirl”

find /etc/ -name “*.conf”

1. 正则表达式介绍

1.1 什么是正则表达式?

简单地说,正则表达式就是为处理大量的字符串及文本定义的一套规则和方法。假设”@“代表“I am”,“!”代表“oldboy”,则执行echo “@!”的结果就是输出“I am oldboy”。通过这些特殊符号的辅助,管理员就可以快速过滤、替换或输出需要的字符串,让Linux运维更高效。

1.2 Linux三剑客的正则表达式有如下特点:

  • 为处理大量文本及字符串而定义的一套规则和方法
  • 其工作时以行为单位进行,即一次处理一行
  • 通过正则表达式可以将复杂的处理任务化繁为简,提高操作Linux的效率
  • 仅被三剑客(grep/egrep、sed、awk)命令支持,其他命令无法使用

做 写 想 【讲】

alias net='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
  • 1

测试准备:

cat >>/etc/profile<<EOF              #<==注意EOF后面不要有多余的空格。
export  LC_ALL=C
EOF                                  #<==注意EOF前后都没有空格或其他符号。
source  /etc/profile                #<==使修改的内容生效。

mkdir ~ /test -p
cat >~/test/oldboy.txt<<EOF
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF

cd ~/test
cat oldboy.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.3 基础正则表达式字符说明及实践:

给要过滤的内容添加标识,然后把符合标识的内容过滤。

字符作用
^尖角号,用法为^oldboy,表示匹配以oldboy单词开头的行
$美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行
^$组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行
.点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)
\转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
*匹配前一个字符(连续出现)0次或1次以上 注意,当重复0次的时候,表示啥也没有(空),即匹配所有内容
.*组合符,匹配所有内容
^.*组合符,匹配以任意多个字符开头的内容
.*$组合符,以任意多个字符结尾的内容
[abc]匹配[]集合内的任意一个字符a或b或c;[abc]也可写成[a-c]
[^abc]匹配不包含后的任意字符a或b或c,这里的表示对[abc]的取反,^不能用!替代

^ 尖角号,用法为^oldboy,表示匹配以oldboy单词开头的行

[root@oldboy test]# grep ^I oldboy.txt #输出以I开头的行
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!

[root@oldboy test]# ls -l ~|grep ^d #输出以d开头的行
drwxr-xr-x. 2 1000 root       33 Jul  1  2030 abc
drwxr-xr-x. 2 root root       45 Jun  6  2019 girlLove
drwxr-xr-x. 3 root root       17 May  8  2021 oldboy_dir
drwxr-xr-x. 2 root root       24 May 25 11:24 test
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

$ 美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行

[root@oldboy test]# grep m$ oldboy.txt #输出以m结尾的行
our site is http://www.oldboyedu.com

[root@oldboy test]# ls -lF ~|grep /$
drwxr-xr-x. 2 1000 root       33 Jul  1  2030 abc/
drwxr-xr-x. 2 root root       45 Jun  6  2019 girlLove/
drwxr-xr-x. 3 root root       17 May  8  2021 oldboy_dir/
drwxr-xr-x. 2 root root       24 May 25 11:24 test/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行

[root@oldboy test]# cat oldboy.txt -n
     1	I am oldboy teacher!
     2	I teach linux.
     3	
     4	I like badminton ball ,billiard ball and chinese chess!
     5	our site is http://www.oldboyedu.com
     6	my qq num is 49000448.
     7	
     8	not 4900000448.
     9	my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# grep ^$ oldboy.txt 

[root@oldboy test]# grep -n ^$ oldboy.txt  #输出空行并打印行号
3:
7:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

. 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)

[root@oldboy test]# grep . oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# grep -n . oldboy.txt 
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:our site is http://www.oldboyedu.com
6:my qq num is 49000448.
8:not 4900000448.
9:my god ,i am not oldbey,but OLDBOY!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点

[root@oldboy test]# grep "\." oldboy.txt #匹配带点的行
I teach linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
[root@oldboy test]# grep "\.$" oldboy.txt #匹配以点结尾的行
I teach linux.
my qq num is 49000448.
not 4900000448.
[root@oldboy test]# grep ".$" oldboy.txt  #匹配以任意一个字符结尾的行
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

* 重复前一个字符(连续出现)0次或N次
0*

0
00
00000

[root@oldboy test]# grep "0*" oldboy.txt 
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# grep "00*" oldboy.txt 
my qq num is 49000448.
not 4900000448.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意,当重复0次的时候,表示啥也没有(空),即匹配所有内容

.* 组合符,匹配所有内容

[root@oldboy test]# grep ".*" oldboy.txt 
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

^.* 组合符,匹配以任意多个字符开头的内容

[root@oldboy test]# grep "^.*" oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

.*$ 组合符,以任意多个字符结尾的内容

[root@oldboy test]# grep ".*$" oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1.4 测试题:

1.过滤/etc/passwd中以nologin结尾的行。

grep "nologin$" /etc/passwd
  • 1

2.过滤/etc/passwd中以o开头的行。

grep "^o" /etc/passwd
  • 1

3.过滤/etc/passwd中至少含有1个0字符串的行。

grep "00*" /etc/passwd
  • 1

4.过滤/etc/passwd中的空行。

grep "^$" /etc/passwd
  • 1

5.过滤/etc/目录中(不含子目录)下的所有文件。

ls -l /etc|grep "^-"
  • 1

6.过滤/etc/services中含有点号的行。

grep "\." /etc/services
  • 1

[abc] 匹配[]集合内的任意一个字符a或b或c;[abc]也可写成[a-c]

[root@oldboy test]# grep "[a-z0-9A-Z\.\!:,/]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!


[root@oldboy test]# grep "." oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

[^abc] 匹配不包含后的任意字符a或b或c,这里的表示对[abc]的取反,^不能用!替代

[root@oldboy test]# grep "[a-z0-9A-Z]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# 
[root@oldboy test]# 
[root@oldboy test]# 
[root@oldboy test]# 
[root@oldboy test]# grep "[^a-z0-9A-Z]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.5 扩展正则:

字符作用
+匹配前一个字符1次或多次
[
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/153845
推荐阅读
相关标签