grep、egrep搜索工具
你知道怎样在文本中检索出自己需要的数据吗?
对,grep,egrep命令可以做到的不仅仅是这些,让我来介绍一下吧。
grep、egrep是什么?
grep、egrep都是文本搜索工具
grep、egrep能做什么?
1)根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;
2)打印出符合条件的行。
你肯定在想grep,egrep是什么关系?
egrep是支持使用扩展正则表达式的grep命令。相当于grep -E
grep命令用法介绍:
grep [OPTIONS](注:选项) PATTERN(注:过滤条件) [FILE...](检索的文本文件)
选项1:
--color=auto: | 对匹配到的文本着色后高亮显示 |
-i | 忽略字符大小写; |
-o | 仅显示匹配到的文本自身; |
-v | --invert-match:反向匹配; |
-E | 支持扩展的正则表达式; |
-q, --quiet, --silient | 静默模式,不输出任何信息; |
基本正则表达式的原字符介绍(注:我们的过滤条件是由文本字符及正则表达式元字符所编写的。)
1.字符匹配类:
- .:匹配任意单个字符;
- [ ]:匹配范围内的任意单个字符;
- [^ ]:匹配范围外的任意单个字符;
- 字符集 [:digit:] 所有数字 ,[:lower:]所有小写字母, [:upper:]所有大写字母, [:alpha:]所有字母, [:alnum:]所有的字母和数字,[:space:]所有空白字符, [:blank:]空白, [:punct:]所有标点符号
2.匹配次数类:
用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式。
- *:匹配前面的字符任意次(0,1或多次);
例如:grep "x*y" a2 注:只要含有y的都可以匹配到
- .*:任意长度的任意字符;
例如:grep “^x.*y” a2 注:.*表示以x开头中间跟上任意字符并含有y的字符将被匹配。
- \+:匹配前面的字符至少1次;
例如:grep “^[[:space:]]\+[[:space:]]” /etc/grub2.cfg 注:\+匹配行首的空白行出现1次及以上
- \?:匹配前面的0次或1次,即前面的字符可有可无;
例如:grep "x\?y" 注:只要是含有y的都可以匹配到
- \{m\}:其前面的字符出现m次,m为非负整数;
例如: grep "x\{2\}y" 注:\{2\}匹配x要出现两次。 只有xxxyabc符合
- \{m,n\}:匹配前面的字符至少m次至多n次
例如:grep "\<[0-9]\{2\3}\>" /etc/passwd 注:匹配文件中至少2位至多3位的数字。
- \<:牟定词首 \>:牟定词尾,用来限定匹配完整单词的。
- \{0,n\}:至多n次;
- \{m,\}:至少m次;
3.位置锚定类:
限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;
- ^:行首锚定;用于模式的最左侧, 例如:grep “^s” a1 注:s开头的行
- $:行尾锚定;用于模式的最右侧,PATTERN$ 例如:grep “s$”a1 注:s结尾的行
^PATTERN$:要让PATTERN完全匹配一整行; 例如: grep “^xy$”a2 注:只有xy的行
- ^$:空行; 例如:grep “^$” a2 注:找出a2中的空行
- ^[[:space:]]*$:空行或者包含空白字符的行 例如:grep "^[[:space:]]*$" a2
- \<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
- \>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
- \<PATTERN\>:单词锚定;单词:由非特殊字符组成的连续字符(字符串)都称为单词;
4.分组与引用类:
- \(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;
- Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1, \2, \3, ...
\(pat2\)pat3\(pat4\(pat5\)pat6\)
注:\1是\(pat2)模式匹配的结果的引用。 \2是\(pat4\(pat5\)的引用
- \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
- \1:第一组括号中的pattern匹配到的字符串;
- \2:第二组括号中的pattern匹配到的字符串
egerp介绍
egrep [OPTIONS] PATTERN [FILE...]
选项2
-E, --extended-regexp:支持使用扩展正则表达式
-F, --fixed-strings:支持使用固定字符串,不支持正则表达式,相当于fgrep;
-G, --basic-regexp:支持使用基本正则表达式;
-P, --perl-regexp:支持使用pcre正则表达式;
-e PATTERN, --regexp=PATTERN:多模式机制;
-f FILE, --file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;
-A NUM, --after-context=NUM
-B NUM, --before-context=NUM
-C NUM, -NUM, --context=NUM
egrep的正则元字符介绍
总结: 相同点:在字符匹配类和锚定类是一样的。
不同点: 匹配次数类和分组引用类,各字符的控制语意一样,写法上扩展上少写了\。分组引用引出了或的机制
匹配次数:
- *:任意次;
- ?:0次或1次;
- +:1次或多次;
- {m}:匹配m次;
- {m,n}:至少m次,至多n次;
- {0,n}:至多n次
- {m,}:至少m次
分组及引用:
- (pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;
后向引用:\1, \2, ...
例如:或者:a|b:a或者b C|cat:表示C或cat (C|c)at:表示Cat或cat
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
练习提升
1、显示/etc/passwd文件中不以bash结尾的行;
~]# egrep -v "bash$" /etc/passwd
2、找出/etc/passwd文件中的三位或四位数;
~]# egrep "\<[0-9]{3,4}\>" /etc/passwd
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
grep -E "^[[:space:]]+[[:space:]]" /etc/grub.cfg
4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;
netstat -tan | grep -E "LISTEN[[:space:]]*$"
5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行;
fdisk -l | egrep "/dev/(sd|hd)[[:lower:]]"
6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
ldd /usr/bin/cat | grep -E "[/]+.*"
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
~]# egrep "^(s|S)" /tmp/meminfo
~]# grep "^[sS]" /tmp/meminfo
~]# grep -i "^s" /tmp/meminfo
8、显示当前系统上root、centos或slackware用户的相关信息;
~]# egrep "^(root|centos|slackware)\>" /etc/passwd
9、echo输出一个绝对路径,使用egrep取出其基名;
~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"
10、找出ifconfig命令结果中的1-255之间的整数;
~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
11、添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户;
~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd