目录
1.正则化
1.1正则表达式(RE)
1.2 正则表达式的注意事项
1.3正则表达式的分类
1.4 基本正则表达式
^:表示匹配文本中以某个字符串开头的行。
$:表示匹配以某个字符串结尾的文件内的行
^$:表示空行,但是在Linux中的实际的操作中一般并不会使用grep去查找空行,更多的是使用相关的命令搜索文本内容(排除空行搜索)
\:转义字符,功能字符,将其他正则表达式中的功能符号的功能去除,使其只有字符层面的含义,还可以表示转义字符序列,例如\n表示换行
字符*:表示0个及以上连续出现的字符
正则表达式的*匹配异常问题
[]:表示一次只匹配[]内的一个字符,其中出现的任何一个都可以匹配到一次或者多次
1.5 正则表达式子的贪婪性
1.6基础正则的总结
1.7 扩展正则表达式
1.7.1 +
1.7.2 |
1.7.3()
1.7.4 {}
1.7.5 ?
1.8总结+练习
练习1:查找有身份证的人的信息
方法2:
练习2: 排除文件中的空行或者含有#的行
1.正则化
1.1正则表达式(RE)
用法:匹配有规律的东西,例如手机号、身份证号、匹配日志等,Linux三剑客可用、开发语言也可用。
1.2 正则表达式的注意事项
- 所有的正则表达式符号均为英文- 通过grep学习正则表达式的标准格式为grep '正则表达式' 文件路径/文件- 给grep、egrep添加颜色:alias grep = ‘grep --color = auto’和alias egrep = ‘egrep --color = auto’- 注意正则系统的字符集:en_US.utf-8如果因为字符集的问题可以进行更改,更改的语句为export LANG=C- 正则表达式≠通配符,二者的区别如下- 正则表达式(RE):多用于匹配字符,仅用于Linux三剑客、find、expr中- 通配符(PE、glob):Linux中的大多数命令都可以使用通配符,可以用于匹配文件、文件名、目录名
1.3正则表达式的分类
正则表达式分为基本正则表达式、扩展正则表达式、Perl正则表达式(正则表达式的高级用法)
1.4 基本正则表达式
测试案例如下:
[root@localhost ~]# vim ceshi.txtThe quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEFHello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
\*$
常见的符号为 ^、$、^$、.、*、.*、[a-z]、[^abc]
^:表示匹配文本中以某个字符串开头的行。
代码测试——^
[root@localhost ~] grep '^T' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
The five boxing wizards jump quickly. 24680
The quick brown fox jumps over the lazy dog. 12345
The five boxing wizards jump quickly. 24680
Today is a beautiful day. 456. 今天天气真好。
The sun is shining brightly. 24680. 阳光灿烂。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
They decided to go for a hike. 56789,他们决定去徒步旅行。
$:表示匹配以某个字符串结尾的文件内的行
代码测试——$
[root@localhost ~] grep '。$' ceshi.txt
Today is a beautiful day. 456. 今天天气真好。
I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
需要注意的就是^符号需要在前面,$符号需要在后面
^$:表示空行,但是在Linux中的实际的操作中一般并不会使用grep去查找空行,更多的是使用相关的命令搜索文本内容(排除空行搜索)
代码测试——^$
[root@localhost ~]# grep -nv '^$' ceshi.txt
1:The quick brown fox jumps over the lazy dog. 12345
2:Pack my box with five dozen liquor jugs. 67890
3:How vexingly quick daft zebras jump! 13579
4:The five boxing wizards jump quickly. 24680
5:1234567890 ABCDEF
6:The quick brown fox jumps over the lazy dog. 12345
7:Pack my box with five dozen liquor jugs. 67890
8:How vexingly quick daft zebras jump! 13579
9:The five boxing wizards jump quickly. 24680
10:1234567890 ABCDEF
16:Hello, world! 这是一段测试文本。123, 你好世界!
17:Today is a beautiful day. 456. 今天天气真好。
20:I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
21:Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
22:The sun is shining brightly. 24680. 阳光灿烂。
23:Don't forget to take an umbrella. 34567,别忘了带伞。
24:She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
25:He is studying hard for the exam. 67890. 他正在为考试努力学习。
26:We had a great time at the party. 13579!我们在派对上玩得很开心。
27:The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
28:I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
29:She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
30:The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
31:They are going to travel around the world. 67890,他们计划环游世界。
32:He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
33:She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
34:The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
35:Don't give up on your dreams. 45678,不要放弃你的梦想。
36:They decided to go for a hike. 56789,他们决定去徒步旅行。
37:What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
\*$
'.'表示任意一个字符,可以用字符串...匹配字符串后的连续的三个任意字符,注意,空格符也算一个任意字符!
三个案例说明可以连续使用
[root@localhost ~] grep '啊.' ceshi.txt What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊![root@localhost ~] grep '的…' ceshi.txt Don't give up on your dreams. 45678,不要放弃你的梦想。 What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊![root@localhost ~] grep '..q' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
\:转义字符,功能字符,将其他正则表达式中的功能符号的功能去除,使其只有字符层面的含义,还可以表示转义字符序列,例如\n表示换行
代码测试——\[root@localhost ~] grep '.*\*' ceshi.txt
\*$
字符*:表示0个及以上连续出现的字符
[root@localhost ~] grep 'x*' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEFHello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
\*$
但是我们会发现没有x的行也会被匹配到,这是什么原因造成的呢?
正则表达式的*匹配异常问题
上述问题的原因就在于*的匹配机制是出现0个字符及以上,这个0个字符的具体表示为匹配空字符的时候,类似于 grep '' ceshi.txt,而grep '2*' ceshi.txt就表示的grep '' ceshi.txt+grep '2' ceshi.txt
需要注意的是:Linux中的文本并不是“所见即所得”的,每一个文本中都有隐含的字符,需要通过cat -A 文件名称 查看全部的字符(如下,显示出全部的隐藏字符的时候汉字也不会是UTF-8的格式了)
[]:表示一次只匹配[]内的一个字符,其中出现的任何一个都可以匹配到一次或者多次
代码测试——[]
[root@localhost ~] grep '[x!]' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
Hello, world! 这是一段测试文本。123, 你好世界!
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
可以使用'-'符号配合中括号来选择多选字符和数字,如下
[root@localhost ~] grep '[a-z0-9]' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
Hello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。
I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
[]里面的内容一般都会被去掉特殊含义,例如
中括号取消转义的练习
[root@localhost ~]# grep '[/*]' ceshi.txt
\*$
[]里面还可以使用取反符号来匹配中括号内都没有出现的行,格式为[^单个字符或者连续的字符] ,如下
[root@localhost ~]# grep '[^abc]' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
Hello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。
I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
\*$
[^] 表示不取里面的字符,排除的意思,如下二例
[^字符]
:这表示匹配任何不是指定字符的单个字符。例如,[^a]
会匹配除了a
之外的任何单个字符。
[^字符串]
:这表示匹配任何不是字符串中任何一个字符的单个字符。例如,[^abc]
会匹配除了a
、b
、c
之外的任何单个字符。
1.5 正则表达式子的贪婪性
当我们在一开始使用到正则表达式的时候我们会发现如下的问题
正则的贪婪行展示
[root@localhost ~] grep '^.*o' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
Hello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。
I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
我们发现想要搜索某个以o结尾的行的时候正则表达式往往会进行到改行的最后一步,也就是说却是是以o结尾了但是行后面的内容不可能再有‘o’这个单次了,这就是正则的贪婪性,问题就在于当我们想要访问一部分以o结尾的正则表达式的时候使用默认的基本正则表达式的方式是不可以的,因为正则存在贪婪性(例如上图的25行我们如果只想要匹配到up o呢?简单正则不会做到因为改行后面还有一个‘yo’它会匹配到最后的yo截止)
这就是正则的特色.在表示所有或使用查找连续出现的时候会表现出尽可能多的贪婪性(就和你在捡地上别人丢的钱一样,尽可能地捡起来更多)
贪婪行无法避免,解决方法就是可以多写一点匹配的内容限制条件来尽可能地限制正则的贪婪性,尽量减少偶然的错误性。
1.6基础正则的总结
$ | 以...结尾的行 | lidao$ |
^$ | 空行 | 搭配^$ |
. | 任意一个字符 | - |
* | 前一个字符连续出现(重复)0次或0次以上 | 搭配.* |
.* | 所有内容 | 搭配.* |
\ | 转义字符, \n \t | - |
[] | 一个整体, 匹配任意一个字符 [abc] a或b或c | [] 与 +搭配 |
[^] | 取反排除 [^abc] | - |
正则贪婪性 | 熟悉特点就ok .* 或连续出现 | - |
1.7 扩展正则表达式
作用:可以解决基础正则无法解决的问题或者可以和正则表达式搭配使用
常见的符号为:+、|、()、{}、?
原先的grep命令并不支持扩展的正则,需要使用egrep或者grep -E、sed -r进行扩展的正则
建议以后的书写都用egrep,因为egrep基础的和扩展的都支持!
egrep的格式为
egrep ‘正则表达式(可以是基础正则也可以是扩展正则,二者可以搭配)’ 文件路径
1.7.1 +
格式为“字符+”
表示加号前的字符连续出现了一次及一次以上
查找2个及以上的‘2’
[root@localhost ~] egrep '2+' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
Hello, world! 这是一段测试文本。123, 你好世界!
The sun is shining brightly. 24680. 阳光灿烂。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
egrep可以和[]进行搭配,例如我们想要搜索文件中的连续的数字
egrep与【】搭配匹配文段中连续数字行
[root@localhost ~]# egrep '[0-9]+' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
Hello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。
I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
当然,如果你只想要数字的话需要使用的选项为-o,简称为egrep -o,具体的命令如下
仅匹配结果
[root@localhost ~] egrep -o [0-9]+ ceshi.txt
12345
67890
13579
24680
1234567890
12345
67890
13579
24680
1234567890
123
456
7890
13579
24680
34567
56789
67890
13579
24680
34567
45678
56789
67890
78901
89012
34567
45678
56789
67890
1.7.2 |
格式为 egrep A|B|C|D|E|…… 文件路径
表示或者A或者B或者C或者D或者E……
与基础正则中[]的区别:
‘[]’的匹配方式一次只能匹配一个字符
‘|’的匹配方式一次可以匹配一个字符串或者一个字符,甚至说一段话,长文本,灵活性更高应用场景:
a.当匹配单个字符或者连续出现的字符的时候使用[]和+
b.当匹配字符串、单词或者长文本的时候使用|,|可以替代[]
扩展正则|的练习
[root@localhost ~] egrep -o 'The|They' ceshi.txt
The
The
The
The
The
The
The
They
The
They
1.7.3()
1.使用场景
a.格式为 egrep ‘(字符串)’ 文件路径,括号内的字符串可以被看成一个整体进行处理
当整体来使用,或者与【】搭配使用
[root@localhost ~]egrep '(Hello)' ceshi.txt
Hello, world! 这是一段测试文本。123, 你好世界![root@localhost ~] egrep 'Hel(l|o)(a|o)' ceshi.txt
Hello, world! 这是一段测试文本。123, 你好世界!
b.后向引用或者反向引用,一般常用于sed中,其他的命令一般也支持
1.7.4 {}
1.格式为
egrep ‘字符或者字符串、长文本{n,m}’ 文件路径n≤字符,字符串,长文本≤m
2.表示字符或者字符串、长文本至少出现n次或最多出现m次,这里的n和m都必须是整数!n到m这几个区间之间是并集的关系!
{}的例子
[root@localhost ~] egrep 'o{2,3}' ceshi.txt
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
搜索包含字母 o 出现0次、1次、2次或3次的行。我们没有三个o的行所以并没有匹配到
[root@localhost ~] egrep -o 'o{0,3}' ceshi.txt
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
oo
o
o
o
o
oo
o
o
o
o
o
o
o
oo
o
o
o
o
o
o
o
o
o
o
也可以匹配正好出现的次数,格式为egrep '字符或者字符串或者长文本{次数}'文件路径
{}匹配正好出现的次数
[root@localhost ~]# egrep 'o{2}' ceshi.txt
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
其他使用较少的用法如下
1.7.5 ?
格式为
egrep ‘字符?’ 文件路径
表示前一个字符出现了0次或者1次,注意:?只能匹配前面的一个字符,如果是字符串的话例如OO?则会匹配到包含0个或1个 "O" 的情况,以及正好2个 "O" 的情况。
测试x出现0次或者1次的行
[root@localhost ~]egrep 'x?' ceshi.txt
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEF
The quick brown fox jumps over the lazy dog. 12345
Pack my box with five dozen liquor jugs. 67890
How vexingly quick daft zebras jump! 13579
The five boxing wizards jump quickly. 24680
1234567890 ABCDEFHello, world! 这是一段测试文本。123, 你好世界!
Today is a beautiful day. 456. 今天天气真好。I love programming, it's fun! 7890; 我喜欢编程,它很有趣。
Let's go to the movies tonight. 13579? 我们今晚去看电影吧?
The sun is shining brightly. 24680. 阳光灿烂。
Don't forget to take an umbrella. 34567,别忘了带伞。
She bought two apples and one orange. 56789!她买了两个苹果和一个橙子。
He is studying hard for the exam. 67890. 他正在为考试努力学习。
We had a great time at the party. 13579!我们在派对上玩得很开心。
The book was on the table, next to the lamp. 24680,书在桌子上,灯旁边。
I can't wait for the weekend. 34567!我已经迫不及待想要到周末了。
She said "hello" and waved goodbye. 45678,她说“你好”然后挥手告别。
The cat is sleeping on the sofa. 56789,猫在沙发上睡觉。
They are going to travel around the world. 67890,他们计划环游世界。
He enjoys playing the guitar in his free time. 78901,他喜欢在空闲时间弹吉他。
She prefers reading books over watching TV. 89012,她更喜欢阅读而不是看电视。
The concert was amazing; we had a blast! 34567,音乐会太棒了;我们玩得很开心!
Don't give up on your dreams. 45678,不要放弃你的梦想。
They decided to go for a hike. 56789,他们决定去徒步旅行。
What a wonderful day to have a picnic! 67890,多么美好的野餐天气啊!
\*$
1.8总结+练习
练习查找相关的身份证号,样例文件如下
王小明 110105197806058930
李小华 110105197806058951
张小红 110105197806058972
刘小刚 110105197806058993
陈小强 110105197806059012
赵小丽 110105197806059033
周小芳 110105197806059054
吴小东 110105197806059075
朱小云 110105197806059096
高小天 110105197806059116
林小海 110105197806059137
徐小山 110105197806059158
孙小石 110105197806059179
马小川 110105197806059190
黄小波 110105197806059219
何小涛 110105197806059230
郭小江 110105197806059251
胡小河 110105197806059272
郑小湖 110105197806059293
梁小海 110105197806059312
谢小溪 110105197806059333
宋小泉 110105197806059354
唐小潭 110105197806059375
许小泊 110105197806059396
邓小湖 110105197806059415
冯小海 110105197806059436
曹小洋 110105197806059457
彭小流 110105197806059478
曾小溪 110105197806059499
肖小河 110105197806059518
田小谷 110105197806059539
樊小川 11010519780605955X
练习1:查找有身份证的人的信息
egrep '[0-9]{17}[0-9X]' sfz.txt
[root@localhost ~] egrep '[0-9]{17}[0-9X]' sfz.txt
王小明 110105197806058930
李小华 110105197806058951
张小红 110105197806058972
刘小刚 110105197806058993
陈小强 110105197806059012
赵小丽 110105197806059033
周小芳 110105197806059054
吴小东 110105197806059075
朱小云 110105197806059096
高小天 110105197806059116
林小海 110105197806059137
徐小山 110105197806059158
孙小石 110105197806059179
马小川 110105197806059190
黄小波 110105197806059219
何小涛 110105197806059230
郭小江 110105197806059251
胡小河 110105197806059272
郑小湖 110105197806059293
梁小海 110105197806059312
谢小溪 110105197806059333
宋小泉 110105197806059354
唐小潭 110105197806059375
许小泊 110105197806059396
邓小湖 110105197806059415
冯小海 110105197806059436
曹小洋 110105197806059457
彭小流 110105197806059478
曾小溪 110105197806059499
肖小河 110105197806059518
田小谷 110105197806059539
樊小川 11010519780605955X
egrep '[0-9]{17}[0-9X]' sfz.txt解析:
因为身份证为18位,但是有人的身份证的最后一位为X,所以我们传统的直接查找全部为数字的人的信息的话是不可行的,需要进行区别对待。分步判断:先判断前17位,[0-9]表示匹配里面任意的字符,共十个数字,{17}表示十七位,[0-9X]表示匹配完前17位之后最后一位可以为0——9的纯数字,或者是X,这样共18位全部的结果都可以查出来了
方法2:
egrep '[0-9]{17}[0-9]$|X$' sfz.txt
[root@localhost ~] egrep '[0-9]{17}[0-9]$|X$' sfz.txt
王小明 110105197806058930
李小华 110105197806058951
张小红 110105197806058972
刘小刚 110105197806058993
陈小强 110105197806059012
赵小丽 110105197806059033
周小芳 110105197806059054
吴小东 110105197806059075
朱小云 110105197806059096
高小天 110105197806059116
林小海 110105197806059137
徐小山 110105197806059158
孙小石 110105197806059179
马小川 110105197806059190
黄小波 110105197806059219
何小涛 110105197806059230
郭小江 110105197806059251
胡小河 110105197806059272
郑小湖 110105197806059293
梁小海 110105197806059312
谢小溪 110105197806059333
宋小泉 110105197806059354
唐小潭 110105197806059375
许小泊 110105197806059396
邓小湖 110105197806059415
冯小海 110105197806059436
曹小洋 110105197806059457
彭小流 110105197806059478
曾小溪 110105197806059499
肖小河 110105197806059518
田小谷 110105197806059539
樊小川 11010519780605955X
练习2: 排除文件中的空行或者含有#的行
[root@localhost ~] egrep -v '^$|#' sfz.txt
王小明 110105197806058930
李小华 110105197806058951
张小红 110105197806058972
刘小刚 110105197806058993
陈小强 110105197806059012
赵小丽 110105197806059033
周小芳 110105197806059054
吴小东 110105197806059075
朱小云 110105197806059096
高小天 110105197806059116
林小海 110105197806059137
徐小山 110105197806059158
孙小石 110105197806059179
马小川 110105197806059190
黄小波 110105197806059219
何小涛 110105197806059230
郭小江 110105197806059251
胡小河 110105197806059272
郑小湖 110105197806059293
梁小海 110105197806059312
谢小溪 110105197806059333
宋小泉 110105197806059354
唐小潭 110105197806059375
许小泊 110105197806059396
邓小湖 110105197806059415
冯小海 110105197806059436
曹小洋 110105197806059457
彭小流 110105197806059478
曾小溪 110105197806059499
肖小河 110105197806059518
田小谷 110105197806059539
樊小川 11010519780605955X
后续的grep、awk、sed等都会持续更新,也就这两天!