您的位置:首页 > 其它

文本处理命令系列――grep

2015-11-09 14:28 176 查看
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 ~]#


本文出自 “Felix Zhang” 博客,请务必保留此出处http://hezhanglinux.blog.51cto.com/10861477/1711006
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: