shell 脚本——第四节课 Linux grep命令与正则表达
一、介绍
很多时候,我们可以使用grep来实现找出文件包含制定信息的那些行
grep命令,sed命令,awk命令三个命令为Linux文本处理的三剑客,这次就让我详细介绍一下grep命令。
grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,而这也就是 grep 命令的全称。
二、grep程序
1、linux下有文本处理三剑客 -- grep sed awk
grep:文本行过滤工具
sed:文本行编辑器(流编辑器)
awk:报告生成器(做文本输出格式化)
2、grep
包含三个命令:grep egrep fgrep,他们是用来进行 行模式(pattern)匹配的
egrep = grep -E //使用扩展的正则表达式进行匹配
fgrep = fast grep //只使用文件通配符进行匹配
*grep默认使用正则表达式进行文本匹配*
3、grep的用法:
grep [option] … PATTERN [filename]
4、grep的常见选项 -- option
-E 支持使用扩展的正则表达式(ERE)(regexp)
-P 使用perl语言的正则表达式引擎进行搜索(每一种语言的正则表达式引擎都不相同,甚至sed grep awk 使用的regexp引擎也不相同)
-i 忽略大小写
-v 进行反选
-o 仅仅输出匹配的内容(默认输出的是匹配到的行)
--color=auto 语法着色
-n 显示行号
-w 匹配固定的单词
三、PATTERN--正则表达式
作用:通过一些特殊字符,来表示一类字符的内容,然后交给前面的命令执行;如果使用特殊字符本身的含义,就需要\进行转义;
回顾:文件通配符(globbing)
*?[][^]
1、字符匹配
. 任意一个字符 相当于?
[] 范围内的任意一个字符
[^] 范围外任意一个字符
字符类:[:digit:] [:alnum:] [:alpha:] [:lower:] [:upper:] [:space:] [:punct:]
2、次数匹配
*匹配前面的字符0次到n次
?匹配前面的字符0次到1次
+ 匹配前面的字符1次到0次
[abc]+ abbbbcccc
\{m\} 匹配前面的字符m次
a\{7\} aaaaaaa
\{m,n\} 匹配前面的字符m到n次
\{0,n\} 匹配前面的字符0次到n次 【0要不要?】
\{m,\} 匹配前面的字符至少m次
3、位置锚定
^ 锚定行首
$ 锚定行尾
\b 锚定词首和锚定词尾
\> 锚定词尾
\< 锚定词首
<\root\> rooter
4、分组
abc* abcccc abc我们要看成一个整体
\(\) 示例:\(abc\)* abcabcabc abcccc
**分组特性:默认情况下,Linux系统会为分组指定变量,变量的表示形式\1 \2 \3 …
示例:\(ab+\(xy\)*\) 其中\1 = ab+\(xy\)*,\2 = xy
四、练习题