Linux文件搜素工具(grep正则表达式)
正则表达式分为两种:
基本正则表达式:BRE basic
扩展正则表达式:ERE extend
元字符:(hello[[:space:]]+)+
Hellp[[:space:]]+ hello加空格可以出现至少一次 (hello[[:space:]]+)+ hello加空格的模式可以连续出现N
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
正则表达式模式的实现或者能够搜索正则表达式都要用到正则表达式引擎
正则表达式引擎;
grep [OPTIONS] PATTERN [FILE…] PATTERN 模式 grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…] 可以把模式写到一个文件中通过-f读取,然后对 file进行过滤
grep命令选项:
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-n,显示行号
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行
基本正则表达式元字符:
分为四种,字符匹配,匹配次数,位置锚定,分组及引用
建立测试文件daidai:
字符匹配:
. :匹配任意单个字符;类似glob中的Grep?“r…t” /etc/passwd
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符; 脱字符
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:alpha:] 所有字母
[:alnum:] 数字和字母
[:punct:] 所有标点符号
[:space:] 空格
匹配次数:
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数
创建一个测试文件呆呆:
文件内容如下:
|104|[[email protected] ~]#vim 呆呆
|105|[[email protected] ~]#cat 呆呆
可可爱爱没有脑袋
白白胖胖充满希望
呆呆傻
傻呆呆
哎哎哎哎哎吖
ccccccf
root
r t
zeehuu
haaaapppy
白白白白白白胖
可可可可可可爱
:匹配其前面的字符任意次;0,1,多次;例如:grep "xy" abxy aby xxxxxy yab
.*:匹配任意长度的任意字符
?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次
前面的无法控制次数,我们还可以精确次数匹配
{m}:匹配 其前面的字符m次; Grep “x{1}y”
{m,n}:匹配其前面的字符至少m次,至多n次;
{0,n} :至多n次
{m,} :至少m次
位置锚定:
^:行首锚定;用于模式的左侧; 脱字符
Grep “^root” /etc/passwd
$ :行尾锚定;用于模式的右侧;
Grep "root:用于PATTERN来匹配整行;
^$ :空白行;
^ [[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
< 或\b:词首锚定,用于单词模式的左侧; Grep “<root” /etc/passwd
> 或\b:词尾锚定,用于单词模式的右侧; Grep “root>” /etc/passwd
<PATTERN>:匹配完整单词; Grep “<root>” /etc/passwd
练习
1、显示/etc/passwd文件中不以/bin/bash结尾的行; ~]
grep -v “/bin/bash$” /etc/passwd
2、找出/etc/passwd文件中的两位数或三位数; ~]
grep “<[0-9]{2,3}>” /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行; ~]
grep “^ [[:space:]]+[ ^ [:space:]]” /etc/grub2.cfg
4、找出"netstat -tan"命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行; ~]
netstat -tan | grep “LISTEN[[:space:]]*$”
分组及引用
创建测试文件“呆呆”:
():将一个或多个字符捆绑在一起,当作一个整体进行处理;
(xy)*ab 命令行中括号有特殊意义所以用转义符\
Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3 . … 括号可以嵌套不能交叉