基本正则表达式 grep命令
一、总结:
grep, egrep, fgrep
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
1、grep:Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(pattern)”逐行去搜索目标文本,打印匹配到的 行;PATTERN:是文本字符和正则表达式的元字符组合而成的匹配条件,可用单引号‘ ’将pattern括 起来以避免shell通配的影响,强引用不替换而显示字符本身。" " 双引号,字符串中的` ` ,$, \ 等特殊字符会被shell解释替换后,再传递给grep。对普通的字符串(没有特殊字符和空格的字符 串)也可以不加引号,直接搜索。
模式:由正则表达式的元字符及文本字符所编写的过滤条件;
语法:grep [options]PATTERN [FILE...]
常用参数: --color=auto:对匹配到的串做高亮显示;
-v:显示模式匹配不到行;
-i: 忽略字符大小写;
-o: 仅显示能够被模式匹配到的串本行;
-q: 静默模式;
-c 显示被匹配到的行数
-n 输出行号
-v 反向选择,即找没有搜索字符串的行
-w 匹配单词
-A # 连同匹配行的下#行一并显示,#代表任意数字
-B # 连同匹配行的上#行一并显示,#代表任意数字
-C # 连同匹配行的上下#行一并显示,#代表任意数字
-R或-r 递归搜索目录或子目录下匹配的字所在文件(可配合find命令
-E 相当于egrep 支持扩展的正则表达式
-F 相当于fgrep 不支持正则表达式
基本正则表达式元字符:
字符匹配:.: 匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围内的任意单个字符;
POSIX特殊字符类:可以通过 man 7 glob查看
[:alpha:] 文字字符 [A-Za-z]
[:digit:] 数字字符 [0-9]
[:graph:] 非空字符(非空格、控制字符)
[:lower:] 小写字符 [a-z]
[:upper:] 大写字符 [A-Z]
[:alnum:] [0-9a-zA-Z]
[:cntrl:] 控制字符
[:print:] 非空字符(包括空格)
[:punct:] 标点符号
[:space:] 所有空白字符(新行,空格,制表符),制表符还可以用\t表示
[:xdigit:] 十六进制数字和字母(0-9,a-f,A-F)
我们在用时要这样用:[[:alpha:]],如果取反就是[^[:digit:]]
次数匹配:用于要指定其次数的字符的后面;
*: 任意次;
\?:0或1次;
\+:1或多次;
\{m\}:精确限制为m次;
\{m,n\}: 至少m次,至多n次,[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
.*: 匹配任意长度的任意字符;
位置锚定:
^: 行首锚定;用于模式的最左侧;
$: 行尾锚定;用于模式的最右侧;
\<, \b: 词首锚定;用于表示单词的模式的左侧;
\>, \b:词尾锚定;用于表示单词的模式的右侧;
^$: 空白行;
分组:\(\)
分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中;这些变量分别是\1, \2, ...
\1: 从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容;
\2:
...
后向引用:使用变量引用前面的分组括号中的模式所匹配到的字符;
扩展的正则表达式:
grep家庭有三个命令:
grep:基本正则表达式
-E: 扩展正则表达式
-F:不支持正则表达式
egrep:扩展正则表达式
fgrep:不支持正则表达式
扩展正则表达式的元字符:
字符匹配:
.: 任意单个字符
[]:
[^]:
次数匹配:
*
?: 0次或1次;
+: 1次以上;
{m}: 精确匹配m次;
{m,n}: 至少m次,至多n次;
锚定:
^: 锚定行首
$: 锚定行尾
\<, \b
\>, \b
分组:()
后向引用:\1, \2, ...
或者:
a|b
C|cat: 不表示Cat或cat,而表示C或cat;
要写成(C|c)at
二、练习
1、显示/etc/passwd文件中以bash结尾的行
2、显示/etc/passwd文件中的两位数或三位数
[Task@magedu ~]$ grep -o '[[:digit:]]\{2,3\}' /etc/passwd 12 10 14 11 12 100 13 30 14 50 99 99 81 81 69 69 499 76 89 89 74 74 500 500 501 27 51 502 502 51 503 503 504 504 |
3、显示`netstat-tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
4、 添加用户bash、testbash、basher以及nologin用户(nologin用户的shell
为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
[Task@magedu ~]$ grep '^\(.*\):.*\1$' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:505:505::/home/bash:/bin/bash nologin:x:508:508::/home/nologin:/sbin/nologin |
5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
[Task@magedu ~]$ grep -E '^(root|centos|user1)' /etc/passwd | cut -d: -f1,3,7 root:0:/bin/bash centos:509:/bin/bash user1:510:/bin/bash |
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名
[Task@magedu ~]$ echo /usr/share/man/man8/iptables-1.4.7.8.gz | egrep -o '[^/]+/?$' iptables-1.4.7.8.gz [Task@magedu ~]$ echo /usr/share/man/man8/iptables-1.4.7.8.gz | egrep -o '^/.*/' /usr/share/man/man8/ |
8、找出ifconfig命令执行结果中1-255之间的数字
ifconfig | grep --color=auto '[^[:alpha:]|0|[:punct:]|[:space:]]'