Linux文本处理三剑客之grep
正则表达式
扩展正则表达式
文本过滤grep
一、正则表达式
- 正则表达式:REGEXP(Regular Expressions):由元字符及文本字符编写的模式(pattern)
- 正则表达式:用来检索、替换符合某个模式的文本
- 元字符:不表示字符的字面意义,而表示控制和通配功能
- 元字符分类:字符匹配、匹配次数、位置锚定、分组
- 程序支持:grep,sed,awk,vim, less,nginx,varnish等
- 正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions) - 正则表达式帮助手册:man 7 regex
1、字符匹配
. :任意单个字符
[]:任意范围内的单个字符
[^]:任意范围外的单个字符
[:digit:]数字
[:alpha:]字母
[:lower:]小写字母
[:upper:]大学字母
[:alnum:]字母数字
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:blank:]空白字符(空白和制表符)
[:punct:]标点符号
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
2、匹配次数:用在指定次数的字符后面,用于表示字符出现的次数
* : 任意次,包括0次
贪婪模式:尽可能多的匹配
\?:至多一次;0次或者1次
\+:至少一次;一次以上
\{n\} :匹配前面的字符n次
\{n,m\}:至少n次,至多m次
\{,m\} :至多m次
\{n,\} :至少n次
3、位置锚定:定位字符出现的位置
^ :首(pattern的最左侧)
$ :尾(pattern的最右侧)
\< :词首
\> :词尾
\b :词首或词尾
4、分组
\( \):将多个字符捆绑在一起,作为一个整体
后向引用: \1:第一个分组
\2:第二个分组
\( \)从左至右,第一个'('和与之对应的')'为第一个分组;以此类推
Note:后向引用的的前面pattern所匹配的内容
或者: \|
C\|cat :表示C或cat
\(C\|c\)at :表示 Cat 或 cat
一、扩展正则表达式
1、字符匹配
. :任意单个字符
[]:任意范围内的单个字符
[^]:任意范围外的单个字符
2、匹配次数:用在指定次数的字符后面,用于表示字符出现的次数
* : 任意次,包括0次
贪婪模式:尽可能多的匹配
?:至多一次;0次或者1次
+:至少一次;一次以上
{n} :匹配前面的字符n次
{n,m}:至少n次,至多m次
{,m} :至多m次
{n,} :至少n次
3、位置锚定:定位字符出现的位置
^ :首(pattern的最左侧)
$ :尾(pattern的最右侧)
\< :词首
\> :词尾
\b :词首或词尾
4、分组
( ):将多个字符捆绑在一起,作为一个整体
后向引用: \1:第一个分组
\2:第二个分组
( )从左至右,第一个'('和与之对应的')'为第一个分组;以此类推
Note:后向引用的的前面pattern所匹配的内容
或者: |
C|cat:表示C或cat
(C|c)at:表示 Cat 或 cat
二、grep
- Linux文本处理三剑客
grep:文本过滤(模式:pattern)工具
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器 - grep: Global search REgular expression and Print out the line
- 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
- 原理:依次从文本中读入一行至grep的内存空间按照pattern中表示的字符串进行检索;匹配到pattern表示的字符串就打印
- Usage: grep [OPTION]… PATTERN [FILE]…
option:
-o:仅显示匹配到的字符串
-i:忽略字符大小写
-A #:after,后#行
-B #:before,前#行
-C #:context,前后#行
-E:egrep,使用扩展正则表达式
-F:fgrep,不支持正则表达式
-m #:匹配多少次之后停止
-f file:根据模式文件处理
-v:显示不被pattern匹配的行
-q:静默模式,不关心匹配输出,只关心是否匹配到时使用
-n:显示匹配的行号
-e:实现多个pattern之间的或关系
-w:匹配整个单词
--color=auto: 对匹配到的文本着色显示
Linux中单词的分隔符:除字母、数字、下划线之外,其余的符号都算单词分隔符
grep的特殊示例:
1、[.*?]:此时表示 . * ? 字符本身的含义!字符放在[]中表示字符本身的含义,不表示元字符。
练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
2、显示/etc/passwd文件中不以/bin/bash结尾的行
3、显示用户rpc默认的shell程序
4、找出/etc/passwd中的两位或三位数
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
7、显示CentOS7上所有UID小于1000以内的用户名和UID
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
1、显示三个用户root、mage、wang的UID和默认shell
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
4、使用egrep取出上面路径的目录名
5、统计last命令中以root登录的每个主机IP地址登录次数
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
7、显示ifconfig命令结果中所有IPv4地址
8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面