文本处理工具
grep作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
参数:
--color=auto: 对匹配到的文本着色显示
-v: 显示不被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A #: after,后#行
-B #: before,前#行
-C #:context,前后各#行
-e:实现多个选项间的逻辑or关系 ##grep �Ce‘cat ’ -e ‘dog’ file
-w:整行匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
字符匹配:
. 匹配任意单个字符;
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
前面要加中括号,egrep不需要
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z,a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:alnum:]:字母和数字
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.*任意长度的任意字符
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n\}匹配前面的字符n次
\{m,n\}匹配前面的字符至少m次,至多n次
\{,n\}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次
分组
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1,\2,\3,...
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b词首锚定,用于单词模式的左侧
\> 或\b词尾锚定;用于单词模式的右侧
\<PATTERN\>匹配整个单词
Egrep扩展正则表达式
继承grep的所有模式匹配,只是不再需要\作为转义符了
egrep多了一个或者(要使用大于号):
a|b: a或b
C|cat: C或cat
(C|c)at:Cat或cat
练习:
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
grep -i "^s" /proc/meminfo
egrep "^(S|s)" /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
grep "/sbin/nologin$" /etc/passwd
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;
grep "^#[[:blank:]]\{1,\}.*" /etc/inittab
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep --color "\:[[:digit:]]\:" /etc/inittab
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
grep "^[[:blank:]]" /boot/grub/grub.conf
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
grep "^\([[:digit:]]\).*\1$" /etc/inittab
7、找出某文件中的,1位数,或2位数;
egrep "\<[[:digit:]]{1,2}\>" /etc/passwd --color
8、显示三个用户root、bin、ftp的UID和默认shell
egrep "^(root|bin|ftp)" /etc/passwd |cut -d: -f1,3,7
9、找出/etc/rc.d/init.d/functions文件中行首为某单词
grep "^\<[[:alpha:]]" /etc/init.d/functions
10、显示ifconfig命令结果中所有IPv4地址
ifconfig |egrep -o"([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"
11、取出/etc/init.d/network的基名
ls /etc/init.d/network |egrep -o "[^/]+$"
12、取出/etc/init.d/network的路径
ls /etc/init.d/network |egrep -o ".*/"