正则表达式和扩展正则表达式
一. 正则表达式
1. grep 文本过滤(模式:pattern)工具 :
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式:grep [OPTIONS] PATTERN [FILE...] 命令选项: --color=auto: 对匹配到的文本着色显示 -v: 显示不被pattern匹配到的行 -i: 忽略字符大小写 -n: 显示匹配的行号 -c: 统计匹配的行数 -o: 仅显示匹配到的字符串 -q: 静默模式,不输出任何信息 -A #: after, 后#行 -B #: before, 前#行 -C #:context, 前后各#行 -e:实现多个选项间的逻辑or关系 例子: grep –e ‘cat ’ -e ‘dog’ file 匹配含有字符串“cat”或 "dog"的行 -w:匹配整个单词 -E:使用ERE -f: 批量匹配文件中的字符串 例子: grep -f file file文件中存要匹配的内容(将行的内容作为要匹配的字符串;多行之间属于或的关系,相当于 -e) -F:相当于fgrep,不支持正则表达式
2. 基本正则表达式(BRE)
元字符分类:字符匹配、匹配次数、位置锚定、分组
i. 字符匹配:
. 匹配任意单个字符 # 需要匹配“.”字符时,用 \. 或 [.] 表示
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
ii. 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次 (非贪婪模式)
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
iii. 位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词
iv. 分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例: \(string1\+\(string2\)*\) \1 :string1\+\(string2\)* \2 :string2
注: 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\|
示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
3. 扩展正则表达式(ERE)
扩展正则表达式的元字符:字符匹配、匹配次数、位置锚定、分组 (与基本正则表达式基本相同;用法相似,除了词首、词尾锚定一样,其他只是在基本正则表达式中去掉转义字符)
与基本正则表达式的比较:写法上比较简单,去掉了大量的转义字符;但需要匹配特殊字符时,扩展正则表达式需将特殊字符用 [] 括起来使用,这时用基本正则表达式比较方便
格式: egrep [OPTIONS] PATTERN [FILE...]
egrep = grep -E(等价)
i. 字符匹配 (与基本正则表达式基本相同)
ii. 位置锚定:
^ :行首
$ :行尾
\<, \b :语首
\>, \b :语尾
iii. 分组:
()
后向引用:\1, \2, ...
iv. 或者:
示例: a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
二. 正则表达式例题:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
i. cat /proc/meminfo |grep -i "^s"
ii. cat /proc/meminfo |grep "^\(s\|S\)"
2、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd |grep -v ":/bin/bash$"
3、显示用户rpc默认的shell程序
cat /etc/passwd |grep -w "^rpc" |cut -d: -f 7
4、找出/etc/passwd中的两位或三位数
cat /etc/passwd |grep -wo "[[:digit:]]\{2,3\}"
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
cat /etc/grub2.cfg | grep "^[[:space:]]\+[^' '].*" 或 cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]].*"
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
netstat -tan | grep ".*LISTEN[[:space:]]*$"
7、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d: -f1,3 |grep -w "[1-9][0-9]\{,2\}$"
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
cat /etc/passwd |grep -w "^\([^:]*\):.*/\1$"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep "^/dev/sd"|grep -wo "[0-9]\+%"|sort -nr
10、显示三个用户root、mage、wang的UID和默认shell
cat /etc/passwd |grep -w "^\(root\|mage\|wang\)" |cut -d: -f 3,7
11、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions |grep -i "^\([_[:alnum:]]\+(\)"
12、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" | grep -Eo "[^/]*[/]?$"|tr -d "/"
13、使用egrep取出上面路径的目录名
echo "/etc/rc.d/init.d/" | grep -Eo "..*[/]\<"
14、统计last命令中以root登录的每个主机IP地址登录次数
last |grep -w "^root.*\<pts" | grep -wE "((([0-9])|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9])|([1-9][0-9])|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]" |tr -s " "|cut -d " " -f3|sort|uniq -c
15、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
16、显示ifconfig命令结果中所有IPv4地址
ifconfig |grep -owE "((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9]{1,2})|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]"
17、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
cat test | grep -o "[[:lower:]]"|sort |uniq -c|sort -nr |tr -s ' ' | cut -d " " -f 3 |tr -d '\n'
注:匹配有效ip地址:
i. grep -owE "((([0-9])|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9])|([1-9][0-9])|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]" -E : 代表扩展正则表达式
ii. grep -owE "((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9]{1,2})|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]"