终于又到了一周一篇博客的日子
在这学习已经三周了,慢慢养成了写博客的好习惯,也慢慢的懂得了怎么写博客。这周给我印象最深刻的就是正则表达式,原本打算要写前几天所学的内容,但是昨天学到正则表达式让我有点懵,所以我今天会用一天的时间去给大家详细讲解正则表达式,争取让那些和我一样困解的人能够豁然开朗,也正是因为正则表达式才激起了我学习的劲头。
一、grep 文本过滤工具(截取关键字的那一行)
grep root /etc/passwd
grep “$USER” /etc/passwd
– -color=auto 将匹配的结果着色显示 (centos6里面在alias加入alias grep=’grep – -color=auto’就可以,centos7默认有)
-v 反向匹配 显示除了你输入的关键字
-i 忽略大小写
-n 显示的结果前增加行号
-c 仅显示匹配到结果的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息 (脚本里面用的多) echo $?可以查看出入的结果正确还是错误 或者 &> /dev/null
-A# 显示搜索关键字的后几行
-B# 显示搜素关键字的前几行
例子:nmap -v -sP 172.17.252.0/24 |grep -B1 “Host is up”|grep for |cut -d” ” -f5 |wc -l 查看当前哪些主机在运行
-C# 显示关键字向前#行,当前行,及向后#行
-e 关键字1 -e 关键字2 显示关键字1和关键字2的行
-w 匹配整个单词
-E 使用扩展正则表达式 或egrep
-F 不使用正则表达式 或 fgrep
二、正则表达式(是由一类特殊字符以及文本字符所编写的模式,其中有些元字符不表示字面意思,而表示控制或通配的功能)
元字符分类:(1)字符匹配
(2)匹配次数
(3)位置锚定
(4)分组
(1)字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 或 [0-9a-zA-Z]
[:alpha:] 或 [a-zA-Z]
[:upper:] 或 [A-Z]
[:lower:] 或 [a-z]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字 或[0-9]
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
(2)匹配次数(用在指定次数的字符后面,用于指定前面的字符要出现的次数)
* 表示匹配前面字符任意次,包括0或者无限次
.* 表示所有,任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次 (需要用’’引起来)
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次 (重复至少m次最多n次)
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
(3)位置锚定(定位出现的位置)
^ 以后面内容为首
$ 以前面内容为尾
^$ 表示空行
\< (开始符) 或 \b 词首锚定,开始与关键词
\> (结束符)或 \b 词尾锚定;结束于关键词
\<PATTERN\> 匹配整个单词,或者字段
(4)分组
\(\)将一个字符或者多个字符捆绑在一起 进行搜索
\(a\).*\1 表示一行以a开头的关键字,中间是任何内容,再以a结束的关键字
\| 表示或 与 grep -e 一样
cat /etc/httpd/conf/httpd.conf |grep -ve “^$” -e “^#”
cat /etc/httpd/conf/httpd.conf |grep -v “^$\|^#” (centos6中)大家可以试一下,因为太长没有办法截图
三、练习(针对以上内容做几道练习题巩固巩固)
1、 显示/proc/meminfo文件中以大小s开头的行(要求:使用两 种方法)
2、显示/etc/passwd文件中不以/bin/bash结尾的行
3、显示用户rpc默认的shell程序
4、找出/etc/passwd中的两位或三位数
(注释:如果不加\< \>的话多位也会显示)
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白 字符开头的且后面存非空白字符的行
6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
7、显示CentOS7上所有系统用户的用户名和UID
如果不加最后面 grep -v root 则root也会别列出在内,因为系统用户是1-999
8、添加用户bash、testbash、basher、sh、nologin(其shell 为/sbin/nologin),找出/etc/passwd用户名同shell名的行
四、egrep =grep -E
扩展正则表达式与正则表达式不同地方为有些地方可以省略\ 但是与grep需要加\相同的地方是:\<, \b :语首 \>, \b :语尾 后向引用:\1, \2
五、练习(针对egrep)
1、 显示三个用户root、mage、wang的UID和默认shell
2、使用egrep取出/etc/rc.d/init.d/functions中其基名
3、利用扩展正则表达式分别表示0-9、100-199、 200-249、250-255
echo {0..255}|egrep -o “\<[0-9]{3}\>” |egrep -o “^1[0-9]{2}” 或者echo {0..255} |egrep -o “\<[0-9]{3}\>” |egrep “^1” 显示100~199
echo {0..255} |egrep -o “\<[0-9]{3}\>” |egrep “^2[0-4]{1}” 显示200~249
以上就是我对文本处理三剑客之一grep的简单理解,希望能够帮住到大家。
我想再强调一点就是写博客是个记忆深刻的很好的方法,希望大家能够坚持下去!
原创文章,作者:In summer,如若转载,请注明出处:http://www.178linux.com/83139