grep及基本正则表达式
2017-09-23 本文已影响230人
Bruce_King
1、grep(Global search REgular expression and Print out the line)
grep是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。
1.1、grep的用法
- grep [OPTIONS] PATTERN [FILE...]
- grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
[root@localhost ~]# cat test
root
rootck
chroot
rroot
roott
rrot
rrtt
rott
Root
rOOT
RooT
[root@localhost ~]# grep "root" test
root
rootck
chroot
rroot
roott
OPTIONS:
-i:忽略字符大小写
[root@localhost ~]# grep -i "root" test
root
rootck
chroot
rroot
roott
Root
rOOT
RooT
-o:仅显示匹配到的字符串本身
[root@localhost ~]# grep -o "root" test
root
root
root
root
root
-V:显示不能被模式匹配到的行
[root@localhost ~]# grep -v "root" test
rrot
rrtt
rott
Root
rOOT
RooT
       -q:静默模式
[root@localhost ~]# grep -q "root" test #不显示输出
-E:仅支持使用扩展的正则表达式
-A #:显示匹配到的行后#行
-B #:显示匹配到的行前#行
-C #:显示匹配到的行前后各#行
-F:快速搜索,等于直接使用fgrep命令
-R:递归查询某个目录下的所有文件
2、基本正则表达式元字符
2.1、字符匹配
.:匹配任意单个字符
[ ]:匹配指定范围内的任意单个字符
[^ ]:匹配指定范围外的任意单个字符
2.2、匹配次数
用在要指定其次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
*:匹配其前面的字符任意次;0,1,多次
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次
\+:匹配其前面的字符1次或多次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次;
2.3、位置锚定
^:行首锚定
$:行尾锚定
^PATTERN$:用于PATTERN来匹配整行
单词:非特殊字符组成的连续字符都称为单词;
\<或\b:词首锚定
\>或\b:词尾锚定
\<PATTERN\>:匹配完整单词
2.4、分组及引用
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
NOTE:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
......
3、练习
3.1、找出/proc/meminfo文件中,所有在大写或小写s开头的行;至少有三种实现方式
- grep -i "^s" /proc/meminfo
- grep -E "^(s|S)" /proc/meminfo
- grep "^[sS]" /proc/meminfo
3.2、显示当前系统上root、centos、user1用户的相关信息
- grep -E "^(centos|user1|root)" /etc/passwd
- grep -E "^<(centos|user1|root)>" /etc/passwd
3.3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
- grep -E "[[:alpha:]]+()" /etc/rc.d/init.d/functions
3.4、使用echo命令输出一绝对路径,使用egrep取出基名;
- echo "/etc/httpd/" | egrep -o "[^/]+/?$"
3.5、找出ifconfig命令结果中的1-255之间的数值
- ifconfig | grep -Eo "<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])>"
3.6、课外作业:找出ifconfig命令结果中的IP地址;
3.7、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行。
- egrep "^ ([^:]+>).*\1$" /etc/passwd