回顾一下上一章所讲的内容,在上一章当中我们讲述了文本处理工具grep命令,它是由用户根据指定的"模式"来进行行匹配,默认为贪婪模式,讲匹配到的结果进行打印到标准输出中来,而正则表达式是由一群特殊的字符所编写的,其中有一些字符并不代表原有的字面意义,而是用于控制或通配的功能,而正则表达式共分类两类,一类是基本正则表达式,另一类是扩展正则表达式,二者区别就是它们的元字符有所不同,而元字符就是用来匹配和控制的功能,那么在这一章当中我们讲述egrep及扩展正则表达式命令。
一、egrep命令
除了我们之前讲到的grep命令之外,还有egrep和fgrep命令,那么grep现在都知道,是支持基本正则表达式,但使用-E
选项就能够支持扩展正则表达式,egrep命令的特性为支持扩展正则表达式,但使用-G
选项就能够支持基本正则表达式,那么fgrep则不支持基本正则表达式,也不支持扩展正则表达式,但使用以上那两个选项就能支持正则表达式,同样的,以上两个无论是grep和egrep只要使用-F
选项就和fgrep一样不支持基本正则表达式和扩展的正则表达式。也就是说,这三个命令通过某些选项来调整其功能就能够支持任何两个命令的特性。
那么egrep也就是支持扩展的正则表达式实现类似于grep文本过滤的功能,同时也可以使用grep -E也可以支持,那么其命令格式也是和grep命令一样:
egrep [options] PATTERN [FILE...]
那么支持的选项也是和grep一样:
-i, -o, -v, -A, -B, -C -G:支持基本正则表达式;
那么接下来我们说一下扩展正则表达式的元字符,它的元字符和基本正则表达式的元字符有很多都是一样的,只不过有些没有了转义符而已。
字符匹配: .:任意单个字符; []:指定范围内的任意单个字符; [^]:指定范围外的任意单个字符; 次数匹配: *:任意次,0, 1或多次; ?:0次或1次,其前面的字符是可有可无的。 +:其前面的字符至少一次; {m}:其前面的字符m次; {m,n}:至少m次,至多n次; {0,n} {m} 位置锚定: ^:行首锚定; $:行尾锚定; \<, \b:词首锚定; \>, \b:词尾锚定; 分组及引用: ():分组:括号内的模式匹配到字符会被记录于正则表达式引擎的内部变量中; 后向引用:\1, \2, ... (不能在bash中引用) 或: a|b:a或者b C|cat:C或者cat; (C|c)at:Cat或者cat;
好的,以上就是扩展正则表达式的元字符,那么现在练习以下习题:
1、找出/proc/meminfo中,所有在大写或小写开头S的行;至少有三种实现方式;
# grep ^[sS] /proc/meminfo # grep -E "^(s|S)" /proc/meminfo # grep -i "^s" /proc/meminfo
2、显示当前系统上root、centos或user1的相关信息:
# grep -E "^(root|centos|user1)\>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
# grep -Eo "^[_[:alpha:]]*\(\)[[:space:]]*" /etc/rc.d/init.d/functions
4、使用echo命令输出一条绝对路径,使用egrep取出基名;
# echo "/etc/sysconfig" | grep -Eo "[^/]+?$"
5、找出ifconfig命令结果中的1-255之间的数值;
# ifconfig | grep -Eo "[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]"
那么fgrep是不支持正则表达式元字符,当没有需要用到元字符去编写模式时,使用fgrep效果更佳;在生产环境中过滤日志时性能会更好。
二、文本查看及处理工具
在这一次我们主要讲以下几个命令:
wc, cut, sort, uniq, diff, patch
wc命令是一个单词统计的命令,主要统计行数、单词数和字节数,其命令格式为:
wc [OPTIONS]... [FILE]...
该命令的选项为:
-l:lines, 统计行数; -w:words, 统计单词数; -c:bytes, 统计字节数;
cut命令是在文件的每一行中提取片段,在每个文件各个行中,把提取的片段显示到标准输出。其命令格式为:
cut OPTIONS [FILE]...
该命令的选项为:
-d CHAR:以指定的字符为分隔符;如果不指,默认为空白为分隔符; -f FILEDS:挑选出的字段; #:指定的多个字段; #-#:连续的多个字段; #,#:离散的多个字段;
sort命令是一个排序的命令,它是排序文本文件的行,其命令格式为:
sort [OPTIONS]... [FILE]...
该命令的选项为:
-n:基于数值大小而非字符进行排序; -t CHAR:指定分隔符; -k#:用于排序比较的字符; -r:逆序排序; -f:忽略字符大小写; -u:重复的行只保留一份; 重复行:连续且相同;
示例:
# sort -t: -k3 -n -r /etc/passwd
uniq命令是一个报告或移除重复的行,和sort命令中的-u选项差不多,那么其命令格式为:
uniq [OPTIONS]... [INPUT [OUTPUT]]
该命令选项为:
-c:显示每行的重复次数; -u:仅显示未曾重复过的行; -d:仅显示重复过的行;
那么diff命令是用来逐行匹配文件的不同之处,可以将其合并,给老文件进行打补丁,其命令格式为:
diff [OPTIONS]... FILE diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
patch就是向文件打补丁的命令,其命令格式为:
patch [OPTIONS] -i /PATH/TO/PATH_FILE /PATH/TO/OLDFILE patch /PATH/TO/OLDDILE < /PATH/TO/PATCH_FILE