首页 / 操作系统 / Linux / grep,egrep 及正则表达式
Linux中一切皆文件:文本文件,对文本文件的搜索就非常的关键和常用。Linux文本搜索工具:grep ,egrep,fgrep,文本搜索指文本文件中内容的搜索。文件名的搜索是linux中bash的特性,globbing,文件名通配,有点windows中的搜索相似,但功能跟强大。一般配合 ls 命令使用。可参考视频:bash基础特性(01)globbing:中的元字符: *:用来通配任意长度任意字符,?:用来匹配单个字符,[]:用于比配指定范围内的字符,[^]:用于取反范围内的字符。总结:globbing文件名通配:既限定了长度,又限定了可用的字符范围。既然要搜索,必须有过滤条件,这里就要用到正则表达式,他是linux 文本处理工具的非常基础和重要。正则表达式(过滤条件)正则表达式中的元字符,以正常字符组合而成。基本正则表达式:grep扩展正则表达式:egrep ,grep E, fgrep:fast,不支持使用正则表达式grep : Global search Regular expression and print out the linegrep 命令: grep [OPTION] PATTEN [FILE…] --color =auto -o :只显示被过滤模式匹配到的内容 -i :搜索时不区分字符大小写 grep "no" -v :显示不能被过滤模式匹配到的行这里用到grep的一个参数--color,color有三个值供选择:never、always、auto。always和auto的区别就是,always会在任何情况下都给匹配字段加上颜色标记,当通过管道或重定向时就会多出一些控制字符,结果会变成
export ^[[1;32m^[[KGREP^[[m^[[K_OPTIONS="--color=always"
export ^[[1;32m^[[KGREP^[[m^[[K_COLOR="1;32"
而auto则只在输出到终端时才加上颜色。
可以在.bashrc里加上
export GREP_OPTIONS="--color=auto"
来实现高亮匹配,具体用什么颜色,可以通过
export GREP_COLOR="a;b" #默认是1;31,即高亮的红色
来设置,其中:
a:可以选择:【0,1,4,5,7,8】 b: 可选择:0 关闭所有属性 30 black
1 设置高亮度 31 red4 下划线 32 green5 闪烁 33 yellow7 反显 34 blue8 消隐 35 purple 36 cyan 37 white 基本正则表达式元字符:字符匹配: . :配任意单个字符 [] :配指定范围内的任意单个字符 [^] :匹配指定范围外的任单个字符,相当于[]取反 [0-9],[[:digit :]],[^0-9][^[:digit :]] [a-z],[[:lower:]] [A-Z],[[:upper:]] [[:space:]] 空格符 [[:punct :]] 标点符号 [0-9a-z A-Z],[[:alnum :]] [a-zA-Z],[[:alpha:]]次数匹配:在期望匹配的字符后面提供一个控制符,用于表达匹配其前面字符指定的次数 *:用于匹配左侧字符任意长度,表示0次,1次或多次 "ab*c"=ac,or,abbc,or abbbc,or abbbbc .*:任意长度任意字符,默认工作于贪婪模式, ?:匹配其前的字符,匹配0次或1次,表示其左侧字符可有可无 "ab?c"=ac,或abc +:匹配前面(左侧)字符1次或多次 "ab+c"=abc,abbc,abbbc {m}:精确匹配左侧字符m次 。ab{2}c=abbc {m,n}:至少m次,至多n次。ab{0,3}c=ac,abc,abbc,abbbc {0,3}:最多3次 {m,}:最少m次锚定位置的字符》匹配位置的限定: ^:锚定行首。^ab $:锚定行尾。ab$ "^ab.*ba$":以ab开头中间任意字符以ab结尾 "^$":匹配空白行 , grep "^$" /etc/rc.d | wc l 表示统计空白行数 "^PATTERN$:用于匹配整行。"^a4*$" 单词锚定:由非特殊字符组成的连续的字符串 <:锚定词首,也可 # grep "<ab"/etc >:锚定词尾,也可 # grep "ab>"/etc <PATTERN>:匹配PATTERN能匹配到的整个单词 # ifconfig | grep "<[0-9]{2}>":精确匹配2位数字单词分组:() 分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中;这些变量分别是1, 2, ...1: 从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容; 2以此类推。#"(ab)*c"扩展正则表达式的元字符:字符匹配:同基本正则表达式次数匹配:*: 0次或多次?: 0次或1次;+: 1次以上;{m}: 精确匹配m次;{m,n}: 至少m次,至多n次;锚定:^: 锚定行首$: 锚定行尾<, : 词首锚定;用于表示单词的模式的左侧;>, :词尾锚定;用于表示单词的模式的右侧;分组:同基本正则表达式( )支持或的概念a|b:匹配a或者b练习:1、显示/etc/passwd文件中以bash结尾的行# grep “bash$”/etc/passwd# grep –E “bash$”/etc/passwd# egrep “bash$” /etc/passwd2、显示/etc/passwd文件中的两位数或三位数# grep “<[[:digit:]]{2,3}>”/etc/passwd# egrep “<[0-9]{2,3}>”/etc/passwd3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行 # netstat –tan | grep “LISTEN[[:space:]]*$” # netstat –tan | egrep “LISTEN[[:space:]]*$”4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行# grep "^([[:alnum:]]+>).*1$" /etc/passwd# egrep "^([[:alnum:]]+>).*1$" /etc/passwd5、显示当前系统上root、CentOS或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)# grep -E "^(root|centos|user1)>" /etc/passwd |cut -d:-f3,7# egrep "^(root|centos|user1)>"/etc/passwd |cut -d: -f3,76、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行# egrep -o "<[[[:alnum:]_]+>()"/etc/rc.d/init.d/functions7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名# echo/etc/sysconfig/network-scripts/ | egrep -o "[[:alnum:]-]+/?$"# echo /etc/sysconfig/network-scripts| egrep -o "(/.*/)"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])>"Linux 基础入门教程----正则表达式基础 http://www.linuxidc.com/Linux/2015-08/121441.htmLinux正则表达式sed 详述 http://www.linuxidc.com/Linux/2015-04/116309.htmLinux正则表达式特性及BRE与ERE的区别 http://www.linuxidc.com/Linux/2014-03/99152.htmgrep使用简明及正则表达式 http://www.linuxidc.com/Linux/2013-08/88534.htm正则表达式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm正则表达式之零宽断言 http://www.linuxidc.com/Linux/2013-03/81897.htmLinux中正则表达式与文件格式化处理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm基础正则表达式 http://www.linuxidc.com/Linux/2014-09/106296.htm常用正则表达式整理 http://www.linuxidc.com/Linux/2014-10/108076.htm本文永久更新链接地址