文本处理:grep(文本搜索工具)、sed(行编辑器)、awk(报告生成器)
基本元字符
正则表达式 | 含义 | 示例 |
---|---|---|
^ | 行起始标志 | ^shiy匹配以shiy起始的行 |
$ | 行尾标志 | shiy$ 匹配以shiy结尾的行 |
. | 匹配任意字符 | hack. 匹hackl和hacki,但是不能匹配hackl2和hackil,它只能匹配单个字符 |
[ ] | 匹配包含[字符]之中的任意一个字符 | coo[k1]匹配 cook和 cool |
[^] | 匹配除[^字符]之外的任意一个字符 | 9[^01]匹配92,93,但是不匹配91或90 |
[-] | 匹配[]中指定范围内的任意一个字符 | [1-5]匹配从1~5的任意一个数字 |
? | 匹配之前的项 0次或者 1次 | Colou?r 匹配color 或者colour,但是不能匹配colouur |
+ | 匹配之前的项1次或多次 | Rollno-9+ 匹配rollno-99,rollno-9,但是不能匹配rollno- |
* | 匹配之前的项0次或多次 | Co*l 匹配cl,col.coool等 |
() | 创建一个用于匹配的子串 | ma(tri)? 匹配max或maxtrix |
{n} | 匹配之前的项n次 | [0-9]{3}匹配任意一个三位数,[0-9]{3}可以扩展为[0-9][0-9][0-9] |
{n,} | 之前的项至少需要匹配n次 | [0-9]{2,}匹配任意一个两位和更多位的数字 |
{n,m} | 指定之前的项所必须匹配的最小次数和最大次数 | [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字 |
l | 交替–匹配两边的任意一项 | Oct (1st l 2nd ) 匹配 oct 1st 和 2nd |
\ | 转义符可以将上面介绍的特殊字符进行转义 | a.b 匹配a.b,.通过在.之间加上前缀,从而忽略了.的特殊意义 |
^$ | 以空开头,以空结尾 | 过滤空行 |
一、grep
1、grep概述
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
2、参数
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
常用参数:
grep -E = egrep
grep -i # 忽略字母大小写
grep -v # -v 表示反向过滤
grep -c # 统计匹配行数
grep -q # 静默,无任何输出
grep -n # 显示匹配结果所在的行号
测试:
-q
[[email protected] mnt]# grep '172.25.254.178' /etc/hosts && echo 'YES' || echo 'NO'
[[email protected] ~]# grep -q '172.25.254.254' /etc/hosts && echo 'YES' || echo 'NO'
YES
-v
[[email protected] ~]# grep -v '172.25.254.254' /etc/hosts && echo 'YES' || echo 'NO'
-n
[[email protected] ~]# grep -n '172.25.254.254' /etc/hosts && echo 'YES' || echo 'NO'
-c
[[email protected] mnt]# cp /etc/passwd /mnt
[[email protected] mnt]# egrep -c '/sbin/nologin' passwd # 统计匹配的行数
38
基本元字符:^ $
[[email protected] mnt]# grep ^root passwd # 过滤以root开头的行
root:x:0:0:root:/root:/bin/bash
[[email protected] mnt]# grep root$ passwd # 过滤以root结尾的行
-i
[[email protected]塞尔ver mnt]# grep -i ^root passwd # 不区分大小写,过滤以root开头的行
root:x:0:0:root:/root:/bin/bash
-E
[[email protected] mnt]# grep -E "^root|root$" passwd #过滤以root开头或者以root结尾的行,-E表示扩展正则表达式
基本元字符:. 过滤非空行