正则表达式--对于系统管理员,每天要处理很多的信息,其中有好多无用的信息,可以通过正则表达式对信息进行过滤筛选,所谓正则表达式,就是通过一些特殊字符的排列,用以搜索,替换,删除一行或多行字符串.
目录
文本过滤工具grep
正则表达式
案例
扩展正则表达式
一、文本过滤工具grep
格式:grep + [选项] + 匹配内容 + [文件]
--color=auto 关键字高亮显示
-v 显示不被匹配到的行
-i 忽略大小写
-n 显示匹配的行号 cat /etc/passwd |grep -n root
-c 显示匹配的行数
-o 仅显示匹配的字符串
-q 静默模式,不显示任何信息
可以用在当我们关心的是执行是否成功,不关心执行结果的时候
grep -q shuguo /etc/group && echo exist || echo not exist 存在则输出exist,不存在则输出not exist
-A + 数字 显示匹配行和向下相邻指定数字的行
cat /etc/passwd |grep -A 3 root
-B + 数字 显示匹配行和向上相邻指定数字的行
-C + 数字 显示匹配行和向上和向下相邻指定数字的行
-e 多个选项之间or关系
grep -e root -e bin /etc/passwd
-w 仅匹配整个单词
-E或egrep 支持正则表达式
grep -E "root|bin" /etc/passwd
egrep "root|bin" /etc/passwd
-F或fgrep 不支持正则表达式
二、正则表达式
字符匹配
. 匹配任意单个字符
[] 匹配范围内的任意单个字符
[^] 匹配范围外的任意单个字符
[:alnum:] [:alpha:] [:lower:] [:upper:] [:digit:] [:punct:]
[:blank:] 空格和制表符
[:space:] 水平和垂直的空白字符(比[:blank:]范围广)
次数匹配 用在要指定次数的字符后面
* 匹配前面的字符任意次,包括0次
例如: .* 任意长度的任意字符
\? 匹配前面的字符0或1次
\+ 匹配前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{m,\} 匹配前面的字符至少m次
位置锚定 定位出现的位置,到哪里开始,到哪里结束
^ 行首锚定
$ 行尾锚定
例如:匹配以#开头,以0结尾,中间内容任意
grep "^#.*0$"
匹配以#开头,以0结尾
grep "^#0$"
^$ 空行
^[[:space:]]*$ 空白行
\< 词首锚定
\> 词尾锚定
分组
\(\) 将一个或多个字符捆绑在一起,当做一个整体进行处理
例如:grep "[ab]\{2\}" 表示a或者b匹配两次
grep "\(ab\)\{2\}" 表示ab这个整体匹配两次
分组括号内匹配到的内容会记录于变量中,这些变量的命名为\1,\2...
\(string1\+\(string2\)\)
\1 表示 string1\+\(string2\)
\2 表示 string2
\| 或
a\|b a或b
\(C\|c\)at Cat或cat
三、案例
1、显示/proc/meminfo文件中以大小s开头的行
cat /proc/meminfo |grep "^s\|^S" cat /proc/meminfo |grep -i ^s grep ^[sS] /proc/meminfo grep -e ^s -e ^S /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd |grep -v "/bin/bash$"
3、显示用户rpc默认的shell程序
grep "^\<rpc\>" /etc/passwd |cut -d: -f7 grep "^rpc\>" /etc/passwd |cut -d: -f7 grep "^\(rpc\)" /etc/passwd |cut -d: -f7
前两个结果一样,是题目要求的结果
注意区别
4、找出/etc/passwd中的两位或三位数
cat /etc/passwd |grep -o "[[:digit:]]\{2,3\}"
cat /etc/passwd |grep -o "[[:digit:]]\{2\}\|[[:digit:]]\{3\}"
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
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 "\<[0-9]\{1,3\}\>"
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
useradd bash
useradd testbash
useradd basher
useradd sh
useradd -s /sbin/nologin nologin
cat /etc/passwd |grep "^\(.*\)\>.*\<\1$"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr
四、扩展正则表达式
egrep = grep -E
egrep的字符匹配,次数匹配,位置锚定,分组和grep的区别就是去掉符号前边的\,除了\<,\>,\b不变
案例:
1、显示三个用户root、mage、wang的UID和默认shell
cat /etc/passwd |cut -d: -f1,3,7 |grep -w "root\|mage\|wang"
cat /etc/passwd |cut -d: -f1,3,7 |grep "^\(root\|mage\|wang\)\>"
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions |egrep "^[_[:alpha:]]+\(\)"
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions |egrep -o "\<[[:alpha:]]*\>$"
echo /etc/rc.d/init.d/functions |egrep -o "\<[a-z]*\>$"
4、使用egrep取出/etc/rc.d/init.d/functions/的目录名
echo /etc/rc.d/init.d/functions/ |egrep -o ".*/." |egrep -o ".*/"
5、统计last命令中以root登录的每个主机IP地址登录次数
last |grep "root" |tr -s " " : |cut -d: -f3 |uniq -c |sort -u
6、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
echo welcome to magedu linux |grep -o . |sort |uniq -c |sort -nr
转载于:https://blog.51cto.com/13570193/2064890