Linux正则化与三剑客速成(一)

目录

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] 会匹配除了 abc 之外的任何单个字符。

 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 |

  1. 格式为 egrep A|B|C|D|E|…… 文件路径

  2. 表示或者A或者B或者C或者D或者E……

  3. 与基础正则中[]的区别:
    ‘[]’的匹配方式一次只能匹配一个字符
    ‘|’的匹配方式一次可以匹配一个字符串或者一个字符,甚至说一段话,长文本,灵活性更高

  4. 应用场景:
    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等都会持续更新,也就这两天!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合,存储元素中key值唯一,每个key对应一个value。 LightWeightMap依据泛型定义,采用轻量级结构,初始默认容量大小为8,每次扩容大小为原始容量的两倍。 集合中k…

Docker的容器

目录 1. 什么是容器?2. 容器的生命周期2.1 容器处理OOM事件2.2 容器异常退出2.3 容器暂停 3. 容器命令详解3.1 容器命令清单3.2 docker create命令3.3 docker run命令3.4 docker ps命令3.5 docker logs命令3.6 docker attach命令3.7 docker exec命令3.8 docker stat…

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器)

完整代码见:zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量,用于控制渲染 GL_POINTS 型图元时,点的大小。可用于粒子系统。将其设置为 gl_Position.z 时,可以使点…

Excel/VBA 正则表达式归纳汇总

1.with结构。以下语句用来提取A列中的“成品”两个字前面的部分的中文,不含成品两个字,结果存放在第2列。使用了On Error Resume Next,表示错误时继续下一条。 Sub 提取口味() Set regx CreateObject("vbscript.regexp") On Err…

CodeMirror 如何动态更新definemode

CodeMirror 如何动态更新definemode 问题描述:解决方法: 问题描述: 项目中有一部分用到了CodeMirror组件,其高亮显示的内容需要根据最新的json动态的更新,需要使用definemode自定义高亮内容。 想要的效果如下&#xf…

用户发送请求后服务端i/o工作过程

华子目录 服务端i/o介绍磁盘i/o机械磁盘的寻道时间、旋转延迟和数据传输时间常见的机械磁盘平均寻道时间值常见磁盘的平均延迟时间每秒最大IOPS的计算方法 网络i/o网络I/O处理过程磁盘和网络i/o 一次完整的请求在内部的执行过程 服务端i/o介绍 i/o在计算机中指Input/Output&am…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高,生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间,人员误入或违规进入将带来严重的安全隐患。为了解决这一问题,迈尔微视推出了智能人体安全检测解决方案,为企业提供全方位的人员安全监…

暂停window11自动更新

window11 的自动更新功能,一方面在后台占用资源,容易导致电脑卡顿;另一方面,“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差,更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

在Win11系统上安装Android Studio

诸神缄默不语-个人CSDN博文目录 下载地址:https://developer.android.google.cn/studio?hlzh-cn 官方安装教程:https://developer.android.google.cn/studio/install?hlzh-cn 点击Next,默认会同时安装Android Studio和Android虚拟机&#…

网络基础概念

目录 一、计算机网络的发展背景1、网络的定义(1) 独立模式(2)网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、初识协议1、协议的概念2、协议的本质3、协议分层(1&#xff…

基于docker安装-高斯DB(opengauss)

获取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/opengauss:latest启动并配置容器 docker run --name OpenGauss --privilegedtrue --restartalways -u root -p 15432:5432 -e GS_PASSWORDEnmo123 -v /etc/localtime:/etc/localtime -v /data/OpenGaus…

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…

Android:展锐T760平台camera PDAF调试

一、平台PDAF流程 目前展锐平台主要支持Shield PD Sensor、Dual PD Sensor 1、Shield PD Sensor Type1相位差和信心度结果直接从Sensor输出,不经过平台算法库。 Type2Sensor端抽取PD信息, 放在一块buffer输出, PDAF算法库算出相位差和信心度。 Type3Sensor端直接输出将带有…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统&#xff08;01&#xff09;- 架构分析 Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角…

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1&#xff1a;git merge&#xff08;保留分支结构&#xff09;方法 2&#xff1a;git rebase&#xff08;线性合并提交历史&#xff09;直接在master分支执行git merge br_feature&#xff0c;再 执行 git pull --reba…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构&#xff0c;可方便地与其他FMC板卡实现高速互联&#xff0c;可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例&#xff0c;实操讲解触摸一体机怎样快速增加大模型语音交互功能&#xff0c;使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音&#xff0c;将语音数据传输…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…