grep及正则表达式
一、grep
1、grep定义
Globally search a Regular Expression and Print
全局搜索(匹配正则表达式的)并打印
扩展命令:
egrep:扩展grep,相当于grep -E 命令,使用扩展正则匹配。
fgrep:fast grep,不支持正则匹配的grep,只能匹配字符本来的意义。
grep与egrep的区别是egrep支持更多扩展的正则
2、grep参数(#代表数字)
-v:显示不匹配的行
-i:忽略字母大小写
-o:只打印匹配的字符
-E:扩展正则表达式
-A #:显示匹配的行以及匹配行后的#行
-B #:显示匹配的行以及匹配行前的#行
-C #:显示匹配的行以及匹配行前后的各#行
--color:定义匹配字符的颜色
颜色标记匹配的字符配置:
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
永久生效修改文件/etc/bashrc添加上面两行内容
3、各个参数举例:
二、正则表达式
1、字符匹配
. :匹配一个字符
[]:匹配范围内任意单个字符
[^]:匹配范围外任意单个字符
例:
原始文件
.:匹配任意一个字符
[]:匹配a,b两个字符
[^]:匹配除了a,b,c三个以外的任意字符
扩展:
[0-9] [[:digit:]] 匹配数字
[a-z] [[:lower:]] 匹配小写字母
[A-Z] [[:upper:]] 匹配大写字母
[[:space:]] 匹配所有空白字符(空格,制表符,新行)
[0-9a-zA-Z] [[:alnum:]] 匹配字母及数字
[a-zA-Z] [[:alpha:]] 匹配字母
[[:punct:]] 标点符号
2、次数匹配
* :任意次数
.*:任意长度的任意字符
\?:0次或1次
\+:1次或多次
\{m\}:m次
\{m,n\}:至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次
例:
*:匹配l任意次数
.*:匹配h开头的任意行
\?:匹配el字符,l可以是0次或1次
\+:匹配el,l最少1个
\{m\}:匹配ell字符
\{m,n\}:匹配el,l最少1次,最多2次
\{0,n\}:匹配el,l最多2次,
\{m,\}:匹配el,l最少1次
3、定位匹配
^:匹配行首
$:匹配行尾
\<,\b:匹配单词词首
\>,\b:匹配单词词尾
例:
^:匹配以h开头的行
$:匹配以d结尾的行
\<:匹配以h开头的单词
\>:匹配以o结尾的单词
\<\>:匹配单词hello
4、分组和引用
\(\):小括号内的为一组
\1,\2,……引用分组,1为第一个小括号内容,2为第二个小括号内容……
例:匹配以4个字符开头并且与开头相同4个字符结尾的行
5、元字符总结:
正则表达式及grep
字符匹配:. [] [^]
次数匹配:* \+ \? \{\}
定位匹配: ^ $ \< \>
分组和后向引用:\(\) \1,\2……
扩展正则表达式及egrep
字符匹配:. [] [^]
次数匹配:* + ? {}
定位匹配:^ $ \< \>
分组和后向引用:() \1,\2……
或者:a|b
扩展正则表达式举例(为省事和上面的例子顺序相同,只截了3个图)
|:匹配w或W的行
三、作业
1、显示/etc/passwd文件中以bash结尾的行
2、显示/etc/passwd文件中的两位数或三位数
3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其完整路径和目录名
目录名:
# echo /etc/rc.d/init.d/functions|grep -o '/.*/' |grep -o '\<[a-zA-Z.]\+\>/$'|grep -o '[a-zA-Z.]\+'
8、找出ifconfig命令执行结果中1-255之间的数字
# ifconfig |egrep '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>'
合并相同的[]为[]{},合并后简写结果
#ifconfig |egrep '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9]{2}\>|\<2[0-4][0-9]\>|\<25[0-5]\>'
省略多余的\<\>,合并简写结果
# ifconfig |egrep '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>'
转载于:https://blog.51cto.com/4708705/1684146