Linux 下grep的用法实例


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



你可能感兴趣的:(linux,grep)