grep基本使用方法
GREP(Global search RegularExpression and Print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。grep也可用于shell脚本,通过执行grep语句来返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
语法:grep [options] 'pattern' FILE
准备工作:
为方便观察grep效果,可以先在~/.bashrc 文件中添加以下内容:
[root@www~]# cat >> ~/.bashrc << EOF
>export GREP_COLOR='01;34'
>alias grep='grep --color=auto'
>EOF
然后执行 source ~/.bashrc
可以事先创建一个练习文件,
[root@www~]# cat >> grep.txt << EOF
Root
MP5is short
rootis root
ThisRoot is not that root
#jackis here.
#tom is here
Howare ya
Howold are you
robert
lab
lib
lb
rooootabc
rot
aroot
rooot
ThinkPad
ipad
pad
aaaroot
EOF
正则表达式元字符集
l^用来锚定行的开始,如:
l$锚定行的结束,如:
l.匹配任意一个非换行符的字符,如:
l* 匹配零个或多个先前字符,如
l.*表示任意长度的任意字符。如:
l[ ]匹配一个指定范围内的单个字符,如:
l[^]匹配一个不在指定范围内的任意单个字符,如:
l\(..\)匹配括弧中的词组,在后面也可以用数字引用,如:
l\< 用于锚定单词的开始,如:
l\> 用于锚定单词的结束,如:
l\< \>用于锚定整个单词,如:
l\{n\}表示其前面的字符,重复出现n次,如:
l\{n,\} 之前的字符至少出现n次,如:
l\{m,n\} 之前的字符至少m次,不多于n次,如:
l\? 表示前面的字符出现0次或1次,如:
l\+表示前面的字符出现至少1次,如:
l\b 的用法跟\<相同,如:
POSIX字符类:
l[:alpha:] 任意一个字母相当于[a-z,A-Z],如:
l[:alnum:] 任意一个字母和数字
l[:digit:] 表示任意一个数字
l[:lower:] 小写字符
l[:punct:] 标点符号
l[:space:] 表示空格或制表符,如,#后面跟了至少一个空格
l[:upper:] 表示大写字母,如:
用于egrep或 grep -E的元字符扩展集
l在egrep中有些元字符没有\,如+用来表示前面的字符出现至少一次,
l{}用来表示次数范围:
l? 匹配零个或1个先前的字符。如:
l(m|n) 用于匹配m或n或,如:
l{m},x{m,},x{m,n} 效果同\{m\},\{m,\},\{m,n\},在此不再赘述。
l常用的grep命令选项
-A�CB -C 参数后面跟数字,表示显示额外的前,后,或前后多少行
-i,--ignore-case忽略大小写差别。
-q,--quiet取消显示,只返回退出状态。0则表示找到了匹配的行。
-v,--revert-match反检索,只显示不匹配的行。
-w,--word-regexp把表达式做为一个单词搜索。
-o, --only-matching 只显示被匹配的内容,如:
-R, -r, --recursive,查找在某个目录下的所有文件
练习:
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
2、取出默认shell为bash,且其用户ID号最小的用户的用户名
3、显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
4、匹配任意一个合法的A/B/C类地址:
[root@www work]# echo > ip.txt << EOF
0.1.1.1
10.1.1.1
192.168.10.1
223.255.255.254
224.0.0.1
223.255.255.255
240.1.1.1
EOF
[root@www work]#grep -E -w"([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])" ip.txt