码迷,mamicode.com
首页 > 其他好文 > 详细

文本处理命令——grep

时间:2015-11-09 19:19:17      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:grep

grep的作用是打印匹配模式的行,只要包含匹配模式的行都打印出来。

语法格式:

grep [OPTIONS] PATTERN [FILE...]
说明:pattern是由文本字符和正则表达式的元字符组合而成的匹配条件。

常用的选项:

-i:忽略大小写。

-v:反向选择,打印不匹配的行。

--color=always|never|auto:使用颜色显示匹配的字符串。

-c:显示匹配的字符串出现的行数。如果和-v选项一起使用,则显示的是没有匹配的行数。

-o:只显示被模式匹配的串,每一个字符串显示一行。结合wc -l可以查看字符串出现的次数。


示例:

[root@Server3 ~]# grep ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 ~]# grep "$HOME" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 ~]# grep "$SHELL" /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
xguest:x:500:500:Guest:/home/xguest:/bin/bash
frame:x:501:501::/home/frame:/bin/bash
hive:x:5000:5000::/home/hive:/bin/bash
test:x:5001:502::/home/test:/bin/bash
[root@Server3 ~]# echo $SHELL
/bin/bash
[root@Server3 ~]# 
说明:grep所匹配的模式可以用单引号,以可以用双引号,还可以不用引号。
如果不含有正则表达式的元字符组成的匹配条件时,即都是文本字符,可以不用引号,也可以用单引号。
如果含有正则表达式的元字符时,要用单引号。
如果含有变量时,用双引号。


示例2:

[root@Server3 ~]# grep root --color=always /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 ~]#
说明:如果想要以后搜索都以颜色的形式显示的话,可以使用alias功能。可以设置在/etc/bashrc中,为所有的用户设置,或是设置在.bashrc中,为指定的用户设置。
如:
[root@Server3 ~]# echo "alias grep=‘grep --color=always‘" >> /etc/bashrc 
[root@Server3 ~]# source /etc/bashrc
[root@Server3 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 ~]# su - frame
[frame@Server3 ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[frame@Server3 ~]$


bash中的通配符(wildcard):

*:任意长度的任意字符。
?:任意单个字符
[]:匹配范围
[^]:排除匹配范围
[:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
[:digit:]  [:graph:]  [:lower:]  [:print:]
[:punct:]  [:space:]  [:upper:]  [:xdigit:]


正则表达式:REGular EXPression,REGEXP

元字符:

.:表示匹配任意单个字符。

示例1:

[root@Server3 ~]#  grep ‘r..t‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@Server3 ~]#
*:表示匹配前面的字符任意次,包括0次。

示例2:

[root@Server3 ~]# grep ‘ro*t‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:496:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
[root@Server3 ~]#
.*:表示匹配任意长度的任意字符。

示例3:

[root@Server3 tmp]# grep ‘a.*b‘ test 
ab
acb
adb
amnb
[root@Server3 tmp]# grep ‘a*b‘ test 
b
ab
acb
adb
amnb
[root@Server3 tmp]# grep ‘aa*b‘ test 
ab
[root@Server3 tmp]# cat test 
a
b
ab
acb
adb
amnb
[root@Server3 tmp]#
?:可能需要使用反斜线进行转义才可以,表示的是前面的字符出现0次或1次。\?

示例4:

[root@Server3 tmp]# grep ‘a\?b‘ test 
b
ab
acb
adb
amnb
[root@Server3 tmp]#


\{n,m\}:匹配前面字符出现n到m次。
\{n,\}:匹配前面字符出现n次以上。
\{n\}:匹配前面字符出现n次。

示例5:

[root@Server3 tmp]# grep ‘a\{1,3\}b‘ test 
ab
[root@Server3 tmp]#


位置锚定:

^:匹配行首,此字符后面的内容必须出现在行首。
$:匹配行尾,此字符后面的内容必须出现在行尾。
^$:匹配空白行。

示例6:

[root@Server3 tmp]# grep ‘^r..t‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@Server3 tmp]# 

[root@Server3 tmp]# grep ‘^id‘ /etc/inittab 
id:3:initdefault:
[root@Server3 tmp]#
[root@Server3 tmp]# grep ‘bash$‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
xguest:x:500:500:Guest:/home/xguest:/bin/bash
frame:x:501:501::/home/frame:/bin/bash
hive:x:5000:5000::/home/hive:/bin/bash
test:x:5001:502::/home/test:/bin/bash
[root@Server3 tmp]#
[ ]:表示指定匹配范围内的任意单个字符。
[^ ]:表示指定范围外的任意单个字符。
注意:使用下面的匹配时,要使用两个方括号,如[[:alpha:]]
[:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
[:digit:]  [:graph:]  [:lower:]  [:print:]
[:punct:]  [:space:]  [:upper:]  [:xdigit:]

示例7:

[root@Server3 tmp]# grep ‘[[:digit:]]$‘ /etc/inittab 
#   5 - X11
[root@Server3 tmp]# grep ‘[0-9]$‘ /etc/inittab 
#   5 - X11
[root@Server3 tmp]#


位置锚定:

\<:表示其后面的任意字符必须作为单词的首部出现。
\>:表示其前面的任意字符必须作为单次的尾部出现。
上述的两个,也可以用\b来表示。
如:\broot表示root出现在词首。root\b表示root出现在词尾。
\<root\>:表示的root单次必须出现在词首和词尾。

示例8:

[root@Server3 tmp]# grep ‘root\b‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 tmp]# grep ‘\broot\b‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Server3 tmp]#


分组:

\(\):将字符串分组,作为一个整体。

如:\(ab\),作用是将ab分为一组,作为一个整体。

使用分组的目的是为了在后面进行引用,\1调用前面第一个左括号以及与之对应的右括号里面匹配的内容。

示例9:

[root@Server3 ~]# grep ‘\(root\)\(:\).*\2\1‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@Server3 ~]#


本文出自 “HeZhang” 博客,请务必保留此出处http://hezhang.blog.51cto.com/1347601/1711005

文本处理命令——grep

标签:grep

原文地址:http://hezhang.blog.51cto.com/1347601/1711005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!