Grep命令

简介:

regexp:元字符


basic regexp:基本正则表达式


extended regexp扩展正则表达式


grep: Global Research Regular Expression and Printing


grep


egrep  


fgrep


使用方法:grep [option] PATTERN file1……



basic regexp:基本正则表达式元字符


.匹配任意单个字符


grep 'r..t'  /etc/passwd



*匹配其前面的字符任意次 包括0


grep "r[a-z]*t"  /etcpasswd匹配 以r开头t结尾 中间包含a-z任意次数的  


grep 'ab*c' (开头必须是内容理由有cb可以出现一次多次,或不出现,



.*任意长度的任意字符


grep 'r.*t' /etc/passwd  贪婪模式  能匹配多长就匹配多长 直到最后一个



[]指定范围内的任意单个字符;只能有一个字符


[abc],[aA],[Cc]at,[a-z]


[^ab除了ab之外的任意单个字符



[^] 取反


也可以支持指定字符集


[:upper:] 大写字母


[:lower:] 小写字母


[:digit:]  数字


[:alpha:] 所有字母


[:alnum:] 字母数字


[:space:] 空字符,tabspace


[:punct:] 标点符号


使用方法[[:upper:]]  取反 [^[:upper:]]



?匹配相面的字符0次或1


ab?c  


abc  abbc  ac abbc肯定不行,因为只可以出现1次或0



X\{m,n\}  X字符至少出现m次  至多出现n


X\{m,\}   至少出现m次,至多不限


X\{0,n\}   至多出现n次,至少不限


使用方法grep "[[:space:]]\{1,\}" test



注意:


grep "[[:space:]]\{1,\}" test


grep "[^[:space:]]\{1,\}" test


两者在文本中没有全空行的情况下效果一样,因为取反只是取非全空行,就字符就满足



锚定符


^行首锚定


grep "^r..t" /etc/passwd



$行尾锚定


grep "^r..t" /etc/passwd



^$空白行锚定


grep "^$" test



单词锚定符号(单词连续的字母,不包含特殊字符)


\<词首锚定 或  \b


grep "\<r..t" /etc/passwd


grep "\br..t" /etc/passwd



\>词尾锚定 或  \b


grep "r..t\>" /etc/passwd


grep "r..t\b" /etc/passwd



\<\>精确匹配 或 \b\b


grep "\<r..t\>" /etc/passwd


grep "\br..t\b" /etc/passwd



\(\)后向引用(前面是某个单词,后面是某个单词+x


grep "\(l..e\).*\1r" text  截取包含以l..e开头后面任意字符直到相同l..e后加r的行


Grep选项


-v对结果取反


-i忽略字母大小写


-o仅显示匹配到字符串


-E支持扩展正则表达式



-A显示匹配行以及该行之后的行    + num 行号


-B之前


-C上下文



extended regexp扩展正则表达式


\(\) --> ()


\{\} --> ()


+次数匹配,匹配其前的字符至少1


|或者 {C|c}  Cat or cat


 C|cat  C  or cat



小练习


1、查找当前系统上名字为user1用户账号的相关信息在/etc/passwd,包含user11myuser1


grep "^\buser1\b" /etc/passwd    考虑属组,锚定行首



查找形如user*这样的用户账户信息


grep "^user[0-9]\{1,\}\b" /etc/passwd



2、查找当前系统上以其为附加组的用户有两个或两个以上的组的相关信息,/etc/group


grep "," /etc/group   附加组必然有逗号


grep "," /etc/group | cut -d: -f1只显示这样组的组名



3、查找当前系统上其用户账号密码最长使用期为99999天的用户账户的相关信息


思路先确定最长使用时间的位置:


用户名:密码:最后修改时间:2次修最少改间隔:2次改最大间隔:警告:闲置:过期:保留



4、分析/etc/inittab文件中如下两行的文本特征,写出可以精确找到类似两行的模式.


形如:l2:2:wait:/etc/rc.d/rc 2


l3:3:wait:/etc/rc.d/rc 3


思路:切片num,引用num


grep "^l\(.\):\1:.*\1$" /etc/inittab


grep "^l\([0-9]\{1,\}\):\1:.*\1$" /etc/inittab



5、显示/proc/meminfo文件中不区分大小写的s开头的行


grep "^[Ss]" /proc/meminfo



6、显示/etc/passwd中以nologin结尾的行


grep "nologin$" /etc/passwd



7、显示/etc/inittab中以#开头,且后跟一个或者多个空白字符串,而后跟任意非空白字符


grep "^#[[:space:]]\{1,\}[^[:space:]]*" /etc/inittab



8、显示/etc/inittab 中包含了 :num:  两个冒号中间一个数字的行


grep ":[0-9]:" /etc/inittab



9、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行


grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf



10、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行


grep "^\([0-9]\).*\1$" /etc/inittab



11、显示出/etc/inittab中非空白的行


grep -v "^$" /etc/inittab



12、取出当前系统上以eth开头的网络设备的IP地址


ifconfig | grep -A 1 'eth' | grep -o "addr:[0-9.]\{1,\}" | cut -d: -f2



13、查询ifconfig1位或者2位数字的行


ifconfig | grep -E "\b([1-9]|[1-9][0-9])\b"



本文转自 ftmoonfans  51CTO博客,原文链接:http://blog.51cto.com/soulboy/1224213


相关文章
|
8月前
|
Unix Linux Perl
我们一起来学grep
我们一起来学grep
58 0
|
Unix Perl
三剑客之 grep
三剑客之 grep
|
弹性计算 Shell Linux
3天玩转shell--6.sed 和grep用法
本文将通过shell代码示例,简单通俗的讲解shell。通过执行代码和运行结果反向掌握shell编程方法。准备一台低配的阿里云ECS Linux环境,跟着教程走起,本文比较适合shell小白。
176 0
|
Web App开发 应用服务中间件 PHP