linux学习20 运维核心技能-grep命令与基本正则表达式
一、回顾
1、bash的特性:hash,变量
命令hash:hash命令
变量:
本地变量,环境变量,局部变量
位置参数变量,特殊变量
变量赋值:name=value,export name=value,declare -x name=value
变量引用:$name,${name}
变量撤销:unset name
2、bash脚本编程,运行脚本
#!/bin/bash
#
3、bash的配置文件
profile类:登陆式shell
bashrc类:非登录式shell
登录式shell: /etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式shell:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
二、文本处理工具
1、Linux上文本处理三剑客
a、grep:文本过滤工具(模式:pattern)工具。
b、sed:stream editor,流编辑器;文本编辑工具;
c、awk:Linux上的实现为gawk,文本报告生成器(格式化文本);
2、正则表达式:Regual Expression,REGEXP
a、由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
b、基本正则表达式:BRE
c、扩展正则表达式:ERE
d、元字符
三、文本处理工具之grep
1、grep:Global search REgular expression and Print out the line。
作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐个进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
2、正则表达式引擎:
grep [OPTIONS] PATTERN [FILE]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
3、常见选项
--color=auto:对匹配到的文本着色后高亮显示
-i: Ignorecase:忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v:--Invert-match:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式元字符
-q:--quiet,silent:静默模式,即不输出任何信息
[root@node1 ~]# grep -q UUID /etc/fstab [root@node1 ~]# echo $? 0 [root@node1 ~]# grep -q UUIID /etc/fstab [root@node1 ~]# echo $? 1
-A #:after,即显示匹配到的和后两行
[root@node1 ~]# grep -A 2 "root" /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 -- operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-B #:before,即显示匹配到的和前两行
[root@node1 ~]# grep -B 2 "root" /etc/passwd root:x:0:0:root:/root:/bin/bash -- halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
-C #:显示前后各两行
[root@node1 ~]# grep -C 2 "root" /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 -- halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
4、基本正则表达式元字符
a、字符匹配
.:匹配任意单个字符
[root@node1 ~]# 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 tomcat:x:53:53:Apache Tomcat:/usr/share/tomcat:/sbin/nologin
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:dlgit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
b、匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪婪模式
*:匹配其前面字符任意次:0,1,多次
例如:grep "x*y"
abxy:可以匹配到
aby:可以匹配到
xxxxxy:可以匹配到
yab:可以匹配到
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次,其前面字符是可有可无的
[root@node1 ~]# grep "x*y" grep.txt abxy aby xxxxxy yab [root@node1 ~]# grep "x\?y" grep.txt abxy aby xxxxxy yab
\+:匹配其前面的字符1次或多次;即前面的字符至少要出现1次
[root@node1 ~]# grep "x\+y" grep.txt abxy xxxxxy
\{m\}:匹配前面字符m次
[root@node1 ~]# grep "x\{1\}y" grep.txt abxy xxxxxy [root@node1 ~]# grep "x\{2\}y" grep.txt xxxxxy
\{m,n\}:匹配其前面的字符至少m次,至多n次;
[root@node1 ~]# grep "x\{2,5\}y" grep.txt xxxxxy
\{0,n\}:至多n次
\{m,\}:至少m此
c、位置锚定
^:行首锚定:用于模式的最左侧
$:行尾锚定:用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词
\<或\b:词首锚定,用于单词模式的左侧
[root@localhost ~]# grep "\<root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
\>或\b:词尾锚定,用于单词模式的右侧
[root@localhost ~]# grep "root\>" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
\<PATERN\>:匹配完整单词
[root@localhost ~]# grep "\<root\>" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
练习:
1、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中两位数或三位数(即锚定以数字开头和结尾并且出现两到三次)
[root@localhost ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
[root@localhost ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出netstat -tan命令的结果中以LISTEN后跟0、1或多个空白字符结尾的行
[root@localhost ~]# netstat -tan|grep "LISTEN[[:space:]]*$" tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
d、分组及引用
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理
\(xy\)*ab:表示xy出现0次,一次或多次然后再匹配ab
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\3...
[root@localhost ~]# grep "l..e.*l..e" lovers.txt He likes his lover He loves his lover She likes her liker She loves her liker [root@localhost ~]# grep "\(l..e\).*\1" lovers.txt He loves his lover She likes her liker
[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 ~]# grep "^\(r..t\).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash
后向引用:引用前面的分组括号中的模式所匹配到的字符。