grep与egrep命令及正则表达式
在Linux中,有很多文本处理的方式,今天我们就来介绍其中的一种grep系。 grep系相对来说也是功能很强大的文本处理工具,俗称文本三剑客之一(其余两个为sed、awk)。 grep系可分为grep、egrep、fgrep(默认情况下不开启正则表达式)。 grep系的功能:利用正则表达式全局搜索,并将匹配的都显示出来 grep的用法格式: grep [options] PATTERN [FILE...] 其中PATTERN为要匹配的字符 先举个简单例子:[root@localhost ~]# grep -c root /etc/passwd 运行时就会在/etc/passwd目录下找出含有root的文件 其中root就是PATTERN 下面我们就重点来谈谈正则表达式。 正则表达式: 元字符:会被正则表达式引擎解释为特殊含义; 基本的正则表达式:BRE(grep默认使用) 扩展的正则表达式:ERE(egrep默认使用) 其中: grep默认仅支持基本正则表达式; egrep默认仅支持扩展正则表达式; fgrep默认不开启正则表达式引擎; 文本字符:只具备字符表面含义的那些字符 grep系的选项有很多,下面列举一些比较常用的选项: -i,--ignore-case 忽略模式 PATTERN 和输入文件中的大小写的分别。
-v,--invert-match 改变匹配的意义,只选择不匹配的行。反向匹配 -c,--count 禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。
-o,--only-matching 只显示匹配的行中与 PATTERN 相匹配的部分。关闭贪婪模式。 -q,--quiet,--silent 安静。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值 0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。 --colour[=WHEN],--color[=WHEN] 在匹配的行周围以 GREP_COLOR 环境变量中指定的记号来标记。WHEN 可以是 `never',`always',或是 `auto'。 -E,--extended-regexp(相当于egrep) 将模式 PATTERN 作为一个扩展的正则表达式来解释 (参见下面)。 -F,--fixed-strings(相当于fgrep) 将模式 PATTERN 视为一个固定的字符串的列表,用新行 (newlines) 分隔,只要匹配其中之一即可。 -G,--basic-regexp(相当于grep) 将模式 PATTERN 作为一个基本的正则表达式 (参见下面) 来解释。这是默认值。 -P,--perl-regexp 将模式 PATTERN 作为一个 Perl 正则表达式来解释。 -A NUM,--after-context=NUM 打印出紧随匹配的行之后的下文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
-B NUM,--before-context=NUM 打印出匹配的行之前的上文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
-C NUM,--context=NUM 打印出匹配的行的上下文前后各NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
PATTERN:正则表达式字符: 基本的正则表达式字符: globbing(简化版的正则表达式) 字符匹配: .:匹配任意单个字符 所有的字符集都可以放到中括号中表示单个字符 []:匹配指定位置的单个字符 [^]:匹配指定位置以外的单个字符 [:xdigit:]:所有的十六进制 a-z:所有的小写字母 A-Z:所有的大写字母 0-9:所有的十进制数字 次数匹配:表示该类字符之前的那个字符可以出现任意次 *:其前面的字符可以出现零壹或多次(使用较多) ?:其前面的字符可有可无 +:其前面的字符至少出现一次 {m}:其前面的字符必须出现m次 {m,n}:其前面的字符至少出现m次,至多出现n次 {,n}:其前面的字符至多出现n次 {m,}:其前面的字符至少出现m次 .*:任意长度的任意字符 位置锚定字符: 行锚定: 行首锚定:^ 行尾锚定:$ 字锚定: 字首锚定:&; 或 (b老方法,一般不用了) 字尾锚定:&; 或 b 注意:对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串; 分组与引用字符: (PATTERN):PATTERN当作整体字串来处理,不分开 例:(yxz):其中把yxz当作一个整体来进行搜素 在正则表达式引擎中,有一系列的内置变量,这些变量会保存至所有分组内的字符信息。用于后向引用,这些变量依次是:1,2,3, 1:第一组小括号中的PATTERN匹配到的字符 2:第2组小括号中的PATTERN匹配到的字符 例:找uid与gid相同的用户 [root@localhost ~]# grep '(&;[[:digit:]]+&;).*1' /etc/passwd 用户名与bash相同 [root@localhost ~]# grep '(&;[[:alpha:]]+&;).*1$' /etc/passwd 或:|(多选一) 注意:|将其左右两边的字符串当作整体对待; 例子: [root@localhost ~]# grep -c '^[[:space:]]*$' 2 ifconfig | grep '&;1[0-9][0-9]&;' ifconfig | grep '&;255&;$'
grep [options] [-e PATTERN | -f FILE] [FILE...] [FILE...] (例:/etc/* ) 默认情况下,grep只有一个PATTERN,如果想要写多个PATTERN的话,要使用-e 选项 将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN,此时我们可以使用-f file方式 egrep:默认仅支持扩展正则表达式 grep [options] PATTERN [FILE...] 扩展的正则表达式元字符与grep差不多 但其“或”符号为: | fgrep:PATTERN所有的字符都被当作文本字符来处理 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |