目录
- 1. 常用文本处理工具
- 2. grep命令
- 3. 基本正则表达式元字符
- 3.1 字符匹配
- 3.2 次数匹配
- 3.3 位置锚定
- 3.4 分组及引用
- 4. 例子
1. 常用文本处理工具
Linux上文本处理三剑客:
- grep:文本过滤工具(pattern模式)工具;
- sed:stream editor,流编辑器,文本编辑工具;
- awk:Linux上的实现为gawk,文本报告生成器(格式化文本)
正则表达式:Regular Expression,REGEXP,由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
2. grep命令
grep:Global search Regular expression and print out the line
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行匹配检查;打印匹配到行;
模式:由正则表达式的元字符及文本字符所编写的过滤条件
正则表达式语法:grep [OPTIONS] PATTERN [FILE...]
OPTIONS:
- - -color = auto:对匹配到的文本着色后高亮显示;
- - i:ignorance,忽略字符的大小写;
- - o:仅显示匹配到的字符串本身;
- - v:- -invert -match:显示不能被模式匹配到;
- - E:支持使用扩展的正则表达式;
- - q,- -quiet:静默模式,不输出任何信息;
- - A #:after,后#行
- - B #:before,前#行
- - C #:context,前后各#行
3. 基本正则表达式元字符
3.1 字符匹配
匹配文本中指定的字符。
- .:匹配任意单个字符;
- []:匹配指定范围内的任意单个字符;
- [^]:匹配指定范围外的任意单个字符;
- [:digit:]:表示所有的数字;
- [:alpha:]:表示所有的字母(不区分大小写);
- [:alnum:]:表示所有的数字;
- [:lower:]:表示所有的小写字母;
- [:upper:]:表示所有的大写字母;
- [:punct:]:表示所有的标点符号;
- [:space:]:表示所有的空白字符;
- [0-9]:任意单个数字;
- [a-z]:任意单个字母。
3.2 次数匹配
用于在要指定次数的字符后面,用于指定前面的字符要出现的次数。
- *:匹配前面的字符任意次;
- .*:任意长度的任意字符;
- ?:匹配其前面的字符0或1次,即前面的可有可无;
- +:匹配其前面的字符至少1次;
- {m}:匹配前面的字符m次;
- {m,n}:匹配前面的字符至少m次,至多n次;
- {0,n}:匹配前面的字符至多n次;
- {m,}:匹配前面的字符至少m次;
3.3 位置锚定
对特定位置进行定位。
- ^:行首锚定,用于模式的最左侧;
- $:行首锚定:用于模式的最右侧;
- ^PATTERN$:用于模式匹配整行;
- ^$:空行,不包含有空格的行;
- ^[[:space:]]*$:空行,但包含有空格的行;
- <或\b:词首锚定,用于单词模式的左侧;
- >或\b:词首锚定,用于单词模式的右侧;
- \<PATTERN\>:匹配整个单词。
3.4 分组及引用
分组是指将一个或多个字符捆绑在一起,当作一个整体进行处理,其符号为:
\(\)
如:(xy)*ab表示xy这个整体可以出现任意次。
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符;
后向引用:引用前面的分组括号中的模式所匹配到的字符。
4. 例子
- 显示/etc/passwd文件中不以/bin/bash结尾的行。
grep -v /bin/bash$ /etc/passwd
- 找出/etc/passwd文件中,包含二位数字或者三位数的行。
grep \<[0-9]\{2,3\}\> /etc/passwd
- 显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式实现。
grep -i ^s /proc/meminfo
grep -i ^S /proc/meminfo
grep ^[Ss] /proc/meminfo
grep -E ^(S|s) /proc/meminfo
- 使用echo输出一个绝对路径,使用egrep取出路径名,类型执行dirname /etc/passwd/的结果。
echo /etc/passwd/|grep -oE ^/[^/]+
- 找出ifconfig中的ip地址。要求结果只显示IP地址。
ifconfig ens33 | grep -E inet[[:space:]] | cut -d' ' -f10