Linux Linux grep命令用法以及正则表达
一、grep命令和正则表达式的简介
1、grep(Global search REgular expression and Print out the line),即全局搜索正则表达式并打印出匹配的行,它是Linux系统中一个强大的文本搜索工具,它根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行;
2、正则表达式是由一类字符书写的模式,其中有些字符不表示符的字面意义,而是表示控制或通配的功能
二、grep命令的基本语法格式
grep [OPTION]... ‘PATTERN‘ FILE... grep的常用选项: -v : 对匹配的行进行取反 -o : 仅显示匹配到的内容 -i : 忽略字符大小写 -n : 为匹配的行加上行号 -E : 使用扩展正则表达式 ,等同于egrep命令 -F : 不使用正则表达式搜索,等同于fgrep命令 -A # : 连同匹配行的下#行一并显示,#代表任意数字 -B # : 连同匹配行的上#行一并显示,#代表任意数字 -C # : 连同匹配行的上下#行一并显示,#代表任意数字 --color=auto : 对匹配的内容以不同的颜色显示
三、grep正则表达式的基本用法
基本正则表达式:
1、字符匹配
.:匹配任意单个字符
例如:匹配以r开头,t结尾中间只隔了两个字符的行 [root@localhost ~]# 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@localhost ~]#
[]:匹配指定集合中的任意单个字符
常用的集合表示方法有: 纯数字:[[:digit:]]或[0-9] 小写字母:[[:lower:]]或[a-z] 大写字母:[[:upper:]]或[A-Z] 大小写字母:[[:alpha:]]或[a-zA-Z] 数字加字母:[[:alnum:]]或[0-9a-zA-Z] 空白字符:[[:space:]] 标点符号:[[:punct:]]
例如:匹配包含数字0或2的行 [root@localhost ~]# grep ‘[02]‘ /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@localhost ~]#
[^]:匹配指定集合外的任意单个字符
例如:匹配包含除1-9范围之外的字符的行 [root@localhost ~]# grep ‘[^1-9]‘ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin saslauth:x:499: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 dbus:x:81:81:System message bus:/:/sbin/nologin rtkit:x:498:499:RealtimeKit:/proc:/sbin/nologin pulse:x:497:498:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@localhost ~]#
2、次数匹配
* : 匹配其前面的字符出现任意次,0、1或多次的行
创建一个测试文本,包含有以下内容: [root@localhost ~]# cat grep_test.txt y->1line xy->2line xxy->3line xxxy->4line aby->5line abcy->7line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
例如:匹配x字母出现任意次的行: [root@localhost ~]# grep ‘x*y‘ grep_test.txt y->1line xy->2line xxy->3line xxxy->4line aby->5line abcy->7line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]# 注意:任意次,说明x可为0次。。
\+:匹配其前面的字符出现1次或多次的行
例如:匹配x字符至少1次的行 [root@localhost ~]# grep ‘x\+y‘ grep_test.txt xy->2line xxy->3line xxxy->4line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
\?:匹配其前面的字符出现0次或1次的行
例如:匹配x字母出现0次或1次的行 [root@localhost ~]# grep ‘x\?y‘ grep_test.txt y->1line xy->2line xxy->3line xxxy->4line aby->5line abcy->7line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
\{m\}:匹配其前面的字符出现m次的行
例如:匹配x字母出现2次的行 [root@localhost ~]# grep ‘x\{2\}y‘ grep_test.txt xxy->3line xxxy->4line xxxy->9line [root@localhost ~]#
\{m,n\}:匹配其前面的字符至少出现m次,至多出现n次的行,m和n表示一个范围[m-n]
例如:匹配x字母至少出现1次,至多出现3次的行 [root@localhost ~]# grep ‘x\{1,3\}y‘ grep_test.txt xy->2line xxy->3line xxxy->4line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
3、位置锚定
^ : 行首锚定
例如:匹配x字母出现在行首的行 [root@localhost ~]# grep ‘^x‘ grep_test.txt xy->2line xxy->3line xxxy->4line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
$ : 行尾锚定
例如:匹配e字母出现在行尾的行 [root@localhost ~]# grep ‘e$‘ grep_test.txt y->1line xy->2line xxy->3line xxxy->4line aby->5line abcy->7line xxxy->9line xy->10line [root@localhost ~]#
^$ : 匹配空白行
例如:匹配空白的行 [root@localhost ~]# grep ‘^$‘ grep_test.txt [root@localhost ~]# 这个文件只有一行空白行...
\< : 词首锚定
例如:精确匹配xy两个字母在一个单词的词首的行 [root@localhost ~]# grep ‘\<xy‘ grep_test.txt xy->2line xyxy->8linexyxy xy->10line [root@localhost ~]#
\> : 词尾锚定
例如:精确匹配xy两个字母在一个单词的词尾的行 [root@localhost ~]# grep ‘xy\>‘ grep_test.txt xy->2line xxy->3line xxxy->4line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
\<\> : 匹配单词
例如:匹配包含xy这个单词的行 [root@localhost ~]# grep ‘\<xy\>‘ grep_test.txt xy->2line xy->10line [root@localhost ~]#
4、分组
\(\) : 对某字符串进行分组匹配
例如:匹配xy单词出现0次或1次的行 [root@localhost ~]# grep ‘\(xy\)\?‘ grep_test.txt y->1line xy->2line xxy->3line xxxy->4line aby->5line abcy->7line xyxy->8linexyxy xxxy->9line xy->10line xxx->11linexy [root@localhost ~]#
后向引用:模式中,如果使用\(\)实现了分组,在某行文本的检查中,如果\(\)的模式匹配到了某内容,此内容后面的模式中可以被引用;
对前面的分组进行引用的符号为:\1 , \2 ,\3
模式自左而右,引用第#个左括号以及与其匹配右括号之间的模式匹配到的内容;
后向引用举例:
新建一个文本文件,假设有如下内容:
[root@localhost ~]# cat grep.txt He like his lover. He love his love. He like his liker. He like his like. [root@localhost ~]#
例如:找出前后相同单词的行: [root@localhost ~]# grep ‘\(\<[[:alpha:]].*\>\).*\<\1\>‘ grep.txt He love his love. He like his like. [root@localhost ~]#
最后,正则表达式元字符总结:
字符匹配:. ,[] ,[^]
次数匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}
位置锚定:^ ,$ ,\< ,\> ,\<\>
分组匹配:\(\)
四、egrep及扩展正则表达式:
egrep相当于grep -E,egrep可以直接使用扩展正则表达式,而grep需要加上选项-E;
扩展正则表达式的元字符:
字符匹配:. ,[] ,[^]
次数匹配:*,?,+,{m},{m,n},{m,},{0,n}
位置锚定:^,$,\>,\<
分组匹配:(),支持后向引用
| : 匹配左侧或右侧符合条件的行,比如a|b,含有a或b的行都匹配;
例如:egrep等同于grep -E [root@localhost ~]# grep -E ‘k|i‘ grep.txt He like his lover. He love his love. He like his liker. He like his like. [root@localhost ~]# egrep ‘k|i‘ grep.txt He like his lover. He love his love. He like his liker. He like his like. [root@localhost ~]#
五、grep练习题:
(1).显示/proc/meminfo文件中以大写或小写s开头的行;
# grep -i ‘^s‘ /proc/meminfo
(2).显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v ‘/sbin/nologin$‘ /etc/passwd | cut -d: -f1
(3).显示/etc/passwd文件中其默认shell为/bin/bash的用户
进一步:仅显示上述结果中其ID号最大的用户
# grep ‘/bin/bash$‘ /etc/passwd | cut -d: -f1 | sort -n -r | head -1
(4).找出/etc/passwd文件中的一位数或两位数;
# grep ‘\<[[:digit:]]\{1,2\}\>‘ /etc/passwd
(5).显示/boot/grub/grub.conf中至少一个空白字符开头的行
# grep ‘^[[:space:]]\+.*‘ /boot/grub/grub.conf
(6).显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep ‘^#[[:space:]]\+[^[:space:]]\+‘ /etc/rc.d/rc.sysinit
(7).找出netstat -tan命令执行结果中包含‘LISTEN‘的行;
# netstat -tan | grep ‘LISTEN[[:space:]]*$
(8).添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认SHELL相同的用户;
# grep ‘\(\<[[:alnum:]]\+\>\).*\1$‘ /etc/passwd
(9).扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行;
# grep ‘\(\<[[:alpha:]]\+\>\).*\1r‘ grep.txt
(10).显示当前系统上root、centos或user1用户的默认shell及用户名;
# grep -E ‘^(root|centos|user1\>)‘ /etc/passwd
(11).找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号‘()"的行;
# grep -o ‘\<[[:alpha:]]\+\>()‘ /etc/rc.d/init.d/functions
(12).使用echo输出一个路径,而使用egrep取出其基名;
# echo /etc/rc.d/ | grep -o ‘[^/]\+/\?$‘ | grep -o ‘[^/]\+‘
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。