标签:grep和正则表达式
正则表达式:是一套处理字符串的规则和方法。以行为单位对字符串进行处理。可以快速过滤替换某些特定字符串。
linux下文本处理的三剑客:
awk sed grep(egrep)
grep grep为global search regular expression(RE) and print out the line的缩写,即根据用户指定的文本搜索模式对目标文件进行搜索并显示能够被模式匹配到的行的一种文本搜索工具。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-i 忽略大小写 [root@redmine ~]# grep -i --color ‘root‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ROOT [root@redmine ~]#
-c 显示被匹配到的行数
[root@redmine ~]# grep -c --color ‘root‘ /etc/passwd 2 [root@redmine ~]#
-n 输出行号
[root@redmine ~]# grep -n ‘root‘ /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 11:operator:x:11:0:operator:/root:/sbin/nologin
-v 反向选择,即找没有搜索字符串的行
[root@redmine ~]# grep -v ‘^r‘ /etc/passwd
-o 仅显示匹配到的内容
[root@redmine ~]# grep -o ‘root‘ /etc/passwd root root root root [root@redmine ~]#
-w 匹配单词
-A # 连同匹配行的下#行一并显示,#代表任意数字
[root@redmine ~]# grep -A2 "postfix" /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@redmine ~]#
-B # 连同匹配行的上#行一并显示,#代表任意数字
[root@redmine ~]# grep -B2 "postfix" /etc/passwd apache:x:48:48:Apache:/var/www:/sbin/nologin saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin [root@redmine ~]#
-C # 连同匹配行的上下#行一并显示,#代表任意数字
[root@redmine ~]# grep -C2 "postfix" /etc/passwd apache:x:48:48:Apache:/var/www:/sbin/nologin saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@redmine ~]#
-R或-r 递归搜索目录或子目录下匹配的字所在文件(可配合find命令
[root@redmine etc]# grep -r "yuanyang" /etc/ /etc/passwd:yuanyang /etc/ssh/sshd_config:yuanyang [root@redmine etc]#
-E 相当于egrep 支持扩展的正则表达式
-F 相当于fgrep 不支持正则表达式
--color对匹配的内容以颜色显示,等价于如下命令,在redhat发行版7.0中默认就有,不用额外执行。
[root@redmine ~]# alias grep=‘grep --color=auto‘
-V 显示grep版本
[root@redmine etc]# grep -V
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
GPLv3+ 许可证: GNU 通用公共许可证第三版或更高版本 <http://gnu.org/licenses/gpl.html>。
这是自由软件: 您可自由更改并重新分发它。
在法律所允许的范围内,不附带任何担保条款。
作者 Mike Haertel 和 其余作者请参看 <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>。
grep中不太常用的选项:
-P, --perl-regexp PATTERN 是一个 Perl 正则表达式
-q 取消显示,只返回退出状态。0则表示找到了匹配的行;找不到返回1,搜索的文件不存在返回2
-h --no-filename #在显示符合样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename #在显示符合样式的那一列之前,表示该列所属的文件名称。(默认方式)
-L:输出时只显示不包含匹配项的文件名,通常与-r选项连用来查找带指定内容的文件。
-l:输出时只显示包含匹配项的文件名。
基础正则表达式
1)"^以什么开头的行"
"^root"以root开头的 如:grep "^root" /etc/passwd
[root@redmine etc]# grep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rootadbed123o [root@redmine etc]#
2)"$"以什么结尾的行
"bash$"以bash结尾的 如:grep "bash$" /etc/passwd
[root@redmine etc]# grep "bash" /etc/passwd root:x:0:0:root:/root:/bin/bash yy:x:500:500:yy:/home/yy:/bin/bash mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash [root@redmine etc]#
3). 代表任意一个字符 如:grep "r..t" /etc/passwd
[root@redmine etc]# 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 rootadbed123o raat [root@redmine etc]#
4)\ 转义符号,让有特殊身份意义的字符还原型。 例:\.
5)\.表示.本身 \逃逸符 如:
[root@redmine etc]# grep "^r\." /etc/passwd r....t r... r..bt [root@redmine etc]#
\? 匹配其前面字符1次或0次
[root@redmine etc]# grep "ro\?t" /etc/passwd vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rot
6)* 重复0个或多个前面的字符。 如:grep "ro*t" /etc/passwd
[root@redmine etc]# 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:497:RealtimeKit:/proc:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rooooot rooot rootadbed123o rot [root@redmine etc]#
7).*匹配所有字符。^.*以任意多个字符开头。
8)[]字符集合的重复特殊字符符号 如grep b[lo]g,表示匹配blg或bog
[root@redmine etc]# grep "[Rr].*[tT]" /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 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rooooot rooot r....t ROOOT ROOT rOOOt RoooT rootadbed123o raat rbbbt r..bt rot
8)[^]匹配不包含^后的任意字符的内容。如[^0-9]表示匹配非数字的内容。
grep ‘[^0-9]‘ /etc/passwd 表示匹配文件中所有的非数字内容。
grep ‘[^a-Z]‘ /etc/passwd 表示匹配文件中所有非字母的内容。
9)a\{n,m\} 匹配前面的a最少n次,最多m次。,如果用egrep可以去掉斜线
[root@redmine etc]# grep "ro\{1,3\}t" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooot rootadbed123o rot [root@redmine etc]#
x\{m,n\}:匹配其前面的字符“x”至少m 次,至多n 次 ,同上;
\{n,\}重复前面一个字符至少n次。
[root@redmine etc]# grep ‘ro\{3,\}t‘ /etc/passwd rooooot rooot [root@redmine etc]#
x\{m,\}:匹配其前面的字符“x”至少m 次 ,同上;
\{n\}重复前面一个字符n次。
[root@redmine etc]# grep ‘ro\{3\}t‘ /etc/passwd rooot [root@redmine etc]#
x\{m\}:匹配其前面的字符“x”m 次(精确匹配) ,同上;
x\{1,\} 1次至无上限
[root@redmine etc]# grep "ro\{1,\}t" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooooot rooot rootadbed123o rot [root@redmine etc]#
位置锚定:
^ 锚定行首,此字符后面的任意内容必须出现在行首
$ 锚定行尾,次字符前面的任意内容必须出现在行尾
^$表示空行
grep -v ‘^$‘ xxx 表示过滤文件中的空行。
[ ] 匹配指定范围内的任意单个字符
[^ ] 匹配指定范围外的任意单个字符
以上几个位置锚定前面有示例,不再赘述。
\< 其后面的任意字符必须作为单词的首部出现 或用 \b
[root@redmine etc]# grep ‘\<p‘ /etc/passwd rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin [root@redmine etc]# [root@redmine etc]# grep ‘\bp‘ /etc/passwd rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin [root@redmine etc]#
\> 其前面的任意字符必须作为单词的尾部出现 或 \b
[root@redmine etc]# grep ‘t\>‘ /etc/passwd root:x:0:0:root:/root:/bin/bash halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rooooot rooot r....t rOOOt raat rbbbt r..bt rot [root@redmine etc]# grep ‘t\b‘ /etc/passwd root:x:0:0:root:/root:/bin/bash halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rooooot rooot r....t rOOOt raat rbbbt r..bt rot
\<\> 锚定单词例如 \<root\> ,注意,这里的单词和词典上定义的单词概念有所不同。这里的单词是指一个由连续的字母,数字和一些符号组成的字符串。例如:”asd!@#-asd_%123”
[root@redmine etc]# grep ‘\<asd!@#-asd_%123\>‘ /etc/passwd asd!@#-asd_%123
字符集合表示:
纯数字 [[:digit:]]或[0-9]
小写字母 [[:lower:]]或[a-z]
大写字母 [[:upper:]]或[A-Z]
大小写字母 [[:alpha:]]或[a-zA-Z]
数字加字母 [[:alnum:]]或[0-9a-zA-Z]
空白字符 [[:space:]] 非空白字符[^[:space:]]
标点符号 [[:punct:]]
\d 匹配任何十进制数,相当于[0-9] -P选项加上
\D 匹配任何非数字字符,相当于[^0-9] -P选项加上
\s 匹配任何空白字符,
\S 匹配任何非空白字符,
\w 匹配任何字母数字字符,相当于[a-zA-Z0-9]
\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9]
\\ 匹配"\"
\( \) 分组后项引用 \1 引用第一个左括号以及与之对应的右括号所包括的所有内容。 \2 \3 …
扩展正则表达式
1)+重复一个或一个以上前面的字符 grep -E ‘ro+t‘ /etc/passwd
[root@redmine etc]# grep -E ‘ro+t‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rooooot rooot rootadbed123o rot
2)?重复0个或一个前面的字符
[root@redmine etc]# grep -E ‘ro?t‘ /etc/passwd vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rot
3)|用或的方式查找多个符合的字符串,如egrep "3306|1521" /etc/service
[root@redmine etc]# grep -E ‘root|yuanyang‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin yuanyang rootadbed123o [root@redmine etc]#
4)()找出用户组字符串 grep -E ‘r(oo|aa)t‘ /etc/passwd
[root@redmine etc]# grep -E ‘r(oo|aa)t‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rootadbed123o raat
()+ 多个重复组的判断 匹配 AabcabcabcC 中间abc为多组 grep -E ‘A(abc)+C‘ test
实例演示:
1.显示/etc/passwd文件中以bash结尾的行
[root@redmine etc]# grep ‘bash$‘ /etc/passwd root:x:0:0:root:/root:/bin/bash yy:x:500:500:yy:/home/yy:/bin/bash mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
2.显示/etc/passwd文件中的两位数或三位数
[root@redmine etc]# grep -o --color ‘[0-9]\{2,3\}‘ /etc/passwd 12 10 14 11 12 100 13 30 14 50 99 99
.................由于篇幅问题,后面不列举出来。
3.显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
netstat -tan | grep ‘LISTEN[[:space:]]*$‘
4.添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
[root@redmine etc]# useradd bash;useradd testbash;useradd basher;useradd nologin -s /sbin/nologin [root@redmine etc]# grep -E ‘(^[[:alnum:]]+\>).*\1$‘ /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:501:501::/home/bash:/bin/bash nologin:x:504:504::/home/nologin:/sbin/nologin
5.显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
[root@redmine etc]# useradd centos;useradd user1 [root@redmine etc]# grep -E ‘^root|^centos|^user1‘ /etc/passwd | cut -d: -f1,3,7 root:0:/bin/bash rootadbed123o centos:505:/bin/bash user1:506:/bin/bash
6.找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
[root@redmine etc]# grep -E ‘\w+\(\)‘ /etc/rc.d/init.d/functions fstab_decode_str() { checkpid() { __readlink() { __fgrep() { __umount_loop() { __umount_loopback_loop() { __pids_var_run() { __pids_pidof() { daemon() { killproc() { pidfileofproc() {
..............
7.使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名
[root@redmine etc]# echo /etc/init.d/functions | grep -oE ‘[^/]+/?*$‘ functions [root@redmine etc]# echo /etc/init.d/functions | grep ‘^[/].*[/]‘ /etc/init.d/functions
8.找出ifconfig命令执行结果中1-255之间的数字
[root@redmine etc]# ifconfig | grep -Eo ‘\<[1-9]\>|\<[0-9\]{2}\>|\<[0-9]{3}\>‘
本文出自 “蒲公英的秘密” 博客,请务必保留此出处http://yylinfan.blog.51cto.com/8670422/1692358
标签:grep和正则表达式
原文地址:http://yylinfan.blog.51cto.com/8670422/1692358