grep正则表达式详解及练习
grep正则表达式详解及练习
一、在学习grep正则表达式前,先了解下linux著名的文本处理三剑客: (1)grep、egrep、fgrep文本搜索工具。 (2)sed文本编辑工具,一种流编辑器,行编辑工具。 (3)awk强大的文本分析工具,文本格式化工具,文本报告生成器。 以上三大命令均支持正则表达式,本文以grep正则表达式为例展开学习。 1、什么是正则表达式? 正则表达式(RegularExpression):由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式只是字符串的一种描述(一种表示法),只有和支持正则表达式的工具相结合才能进行字符串处理。 2、正则表达式的构成: 正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符”,另一种是普通的“文本字符”。元字符可以是一个字符,如“^”,也可以是一个字符序列,如“b”。 3、主要分为两类:(1)基本正则表达式(BRE) (2)扩展正则表达式(ERE) 二、本文以grep为例来讲解正则表达式 1、grep家族有三大成员分别为: grep:支持使用基本正则表达式。 egrep:支持使用扩展正则表达式。 fgrep:不支持使用正则表达式。 2、grep命令: 功能:根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。 常用选项一: --color=auto,每次grep搜索之后,自动高亮显示所匹配字符。 CentOS7定义了grep别名alias grep=’grep--color=auto’ -i:忽略字符大小写 -o:仅输出文件中匹配到的部分 -v:反向查找,输出文件中不匹配的行。 -q:进入静默模式,该模式下,grep命令运行目的仅仅是执行一个条件测试,通常在脚本中使用,通过检查其返回值进行下一步操作。 常用选项二:
-E:支持使用扩展正则表达式,相当于egrep; -F:支持使用固定字符串,不支持正则表达式,相当于fgrep; -G:支持使用基本正则表达式; -P:支持使用pcre正则表达式;
-A:显示匹配字符串及后n行的数据 -B:显示匹配字符串及前n行的数据 -C:显示匹配字符串及前后各n行的数据 -e:多模式机制; -f:FILE为每行包含了一个pattern的文本文件,即grep script; -n:在行首显示行号 3、基本正则表达式元字符: (1)字符匹配: .:匹配任意单个字符 []:匹配范围内的任意单个字符[abc]表示“a”或“b”或“c” [^]:匹配范围外的任意单个字符 [^abc]表示除了“a”、“b”、“c”外的其他任意字符。 (2)匹配次数:用在要指定其出现的次数的字符后面,限制其前面字符出现的次数,默认工作在贪婪模式。 *:匹配前面的字符任意次(0、1、或多次),相当于{0,}; .*:任意长度的任意字符; +:匹配前面的字符至少1次,相当于{1,}?:匹配前面的字符0次或者1次,即前面的字符可有可无,相当于 {m}:其前面的字符出现m次,m为非负整数; {m,n}:其前面字符出现最少m次最多n次,最少m次,{o,SimKai;">最多n次;
(3)位置锚定:限制使用搜索模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的那个位置 ^:行首锚定;用于模式的最左侧,^PATTERN, ^hello搜寻以hello开头的行。 $:行尾锚定;用于模式的最右侧,$PATTERN, $hello搜寻以hello结束的行。 ^PATTERN$:让PATTERN完全匹配一整行,^how are you$搜索内容为”how are you”的行。 ^$:搜寻内没有任何字符的行(包括空白字符),空行 ^[[:space:]]*$:空行或仅有空白字符的行; (4)单词锚定: Linux中的单词指:由非特殊字符组成的连续字符(字符串)。 &;或b:词首锚定,用于单词模式的左侧,&;PATTREN或bPATTERN &;:词尾锚定,用于单词模式的右侧,PATTERN&;或PATTRENb &;PATTERN&;:单词锚定 (5)分组与引用: (PATTERN):将此PATTERN匹配到的字符作为一个不可分割的整体进行处理;分组匹配到的内容会被正则表达式引擎自动记录到内部变量中,这些变量是1,2,3,… pat1(pat2)pat3(pat4(pat5)pat) 1:第一组括号中的pattern匹配到的字符串,从左侧起,第一个左括号及与之匹配的右括号内模式匹配到的内容。 2:第二组括号中的pattern匹配到的字符串,从左侧起,第二个左括号及与之匹配的右括号内模式匹配到的内容。 后向引用:引用前面括号中的模式所匹配到的字符 输出结果中行首字符跟行尾字符相同(行尾引用了行首匹配到内容)。 4、egrep命令: 支持使用扩展正则表达式的grep命令,相当于grep -E,其常用选项基本同grep命令,可参考上文。 5、扩展正则表达式元字符: 扩展正则表达式就是在基本正则表达式的基础上,增加了一些元字符,而且有部分参数是不需要添加转义符使用的。 (1)字符匹配: .:匹配任意单个字符 [ ]:匹配范围内的任意单个字符 [^ ]:匹配范围外的任意单个字符 (2)匹配次数: *:匹配前面的字符任意次(0、1、或多次); .*:任意长度的任意字符; +:匹配前面的字符至少1次 ?: 匹配前面的字符0次或者1次,即前面的字符可有可无; {m}:其前面的字符出现m次,m为非负整数; {m,n}:其前面字符出现最少m次最多n次,{o,n}最多n次 (3)位置锚定: ^:行首 $:行尾 &;,b:词首 &;,0);">b:词尾 (4)分组及引用: ( ):分组 1,2,…:后向引用 注意:特殊用法 C|cat:表示C或cat,表示整个左侧或整个右侧。 (C|c)at:表示Cat或cat 三、作业练习:
1、显示/etc/passwd文件中以bash结尾的行; 2、找出/etc/passwd文件中的三位或四位数; 3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行 4、找出"netstat-tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行; 5、找出"fdisk-l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行; 6、找出”ldd/usr/bin/cat“命令的结果中文件路径; 7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现; 8、显示当前系统上root、centos或spark用户的相关信息; 9、echo输出一个绝对路径,使用egrep取出其基名; 10、找出ifconfig命令结果中的1-255之间的整数; 11、找出系统中其用户名与shell名相同的用户。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |