Linux之文本处理三剑客之egre、fgrep
egrep是grep的另一种模式,用-E选项(启用或关闭命令的某个或某些功能),启用扩展正则表达式引擎功能,使用扩展正则表达式的字符和纯文本字符组合的PATTERN,对文本流逐行匹配检查,将匹配到的字符串所在的行显示至标准输出
fgrep,grep -F选项,关闭正则表达式引擎功能,以纯文本字符组合为PATTERN,基于独有的算法,对文本进行高效的匹配检查,将匹配到的字符串所在的行显示至标准输出
egrep命令
1
2
3
4
5
6
7
8
9
|
[[email protected] ~] # type egrep
egrep is aliased to ` egrep --color=auto'
[[email protected] ~] # which --skip-alias egrep
/usr/bin/egrep [[email protected] ~] # egrep --help #获取使用帮助
Usage: grep [OPTION]... PATTERN [FILE]...
-E, --extended-regexp #ERE
#其帮助内容同grep命令的使用内容 |
-E选项, grep -E 相当于 egrep
1
2
|
# grep -E '^root\b' /etc/passwd # egrep '^root\b' /etc/passwd |
扩展正则表达式字符
字符匹配
匹配次数
位置锚定
或
字符匹配
1) . 任意单个字符
2) [] 指定范围内的任意单个字符, [abc] a或b或c
3) [^] 指定范围外的任意单个字符
使用示例
1
2
3
4
5
6
|
[[email protected] ~] # vim a.txt #vim是一个文本编辑命令,进入后按i键,才可编写文本,编写完毕后。按esc键,再按shift 加 : 键,输入wq加Enter键即可。
how are you? hwo old are you? HOW ARE YOU? HWO OLD ARE YOU? root:x:0:0:root: /root : /bin/bash
|
. 匹配任意单个字符
1
|
# egrep 'r..t' a.txt |
[] 匹配指定范围内的任意单个字符, [abc] a或b或c
1
|
# egrep '[eFH]' a.txt |
[^] 表示指定范围外的任意单个字符, [^abc] 非a和b和c
1
|
# egrep '[^eFH]' a.txt |
次数匹配 前面单个字符出现的次数
1)* 匹配前面单个字符,出现0、1或多次
2)? 匹配前面单个字符,出现0或1次
3)+ 匹配前面单个字符,出现至少1次,>=1次
4){m} 精确匹配前面单个字符m次
5){m,} 匹配前面单个字符,至少m次
6){,n} 至多n次
7){m,n} 至少m次,至多n次
使用示例
1
2
3
4
5
6
7
|
* 匹配前面单个字符,出现0、1或多次
1
|
# egrep 'a*b' output_delimiter.txt |
.* 匹配 . 任意次,任意单个字符任意次,任意长度任意字符,(glob中的*)
1
|
# egrep 'r.*t' a.txt |
? 匹配前面单个字符,出现0或1次 (基本正则表达式中 \? )
1
2
|
# egrep 'a?b' output_delimiter.txt # grep 'a\?b' output_delimiter.txt |
+ 匹配前面单个字符,出现至少1次,>=1次 (基本正则表达式中 \+ )
1
2
|
# egrep 'a+b' output_delimiter.txt # grep 'a\+b' output_delimiter.txt |
{m} 精确匹配前面单个字符m次 (基本正则表达式中 \{m\} )
1
2
|
# egrep 'a{3}b' output_delimiter.txt # grep 'a\{3\}b' output_delimiter.txt |
{m,} 匹配前面单个字符,至少m次 (基本正则表达式中 \{m,\} )
1
2
|
# egrep 'a{3,}b' output_delimiter.txt # grep 'a\{3,\}b' output_delimiter.txt |
{,n} 匹配前面单个字符至多n次 (基本正则表达式中 \{m,\} )
1
2
|
# egrep 'a{,2}b' output_delimiter.txt # grep 'a\{,2\}b' output_delimiter.txt |
{m,n} 匹配前面单个字符至少m次,至多n次 (基本正则表达式中 \{m,n\} )
1
2
|
# egrep 'a{3,6}b' output_delimiter.txt # grep 'a\{3,6\}b' output_delimiter.txt |
位置锚定 ‘期望匹配的字符必须出现在某个位置’
1)^ 行首锚定,用于模式最左侧。由正则表达式所匹配到的字串符必须出现在行首
2)$ 行尾锚定,用于模式最右侧。由正则表达式所匹配到的字串符必须出现在行尾
3)^pattern$: 整行只能匹配此模式
4)匹配空白行: ^[[:space:]]*$ 空白可有任意次数
5)\< 或 \b 词首锚定,用于单词模式的左侧
6)\> 或 \b 词尾锚定,用于单词模式的右侧
7) \<PATTERN\> 或 \bPATTERN\b 匹配整个单词,用于单词左右两侧
8)分组,后向引用 ()
^ 行首锚定,用于模式最左侧。由正则表达式所匹配到的字串符必须出现在行首
1
|
# grep -E '^root' /etc/passwd |
$ 行尾锚定,用于模式最右侧。由正则表达式所匹配到的字串符必须出现在行尾
1
|
# grep -E '/bin/bash$' /etc/passwd |
^pattern$: 整行只能匹配此模式
1
2
|
# grep -E -c '^$' /etc/init.d/functions #匹配空行 -c 显示匹配到的字串所在行的所有行的行数 |
匹配空白行: ^[[:space:]]*$ 空白可有任意次数
1
|
# grep -E -c '^[[:space:]]*$' /etc/init.d/functions #匹配可为空行或有空白字符的行 |
\< 或 \b 词首锚定,用于单词模式的左侧
1
|
# grep -E '\broot' /etc/passwd |
\> 或 \b 词尾锚定,用于单词模式的右侧
1
|
# grep -E 'root\b' /etc/passwd |
\<PATTERN\> 或 \bPATTERN\b 匹配整个单词,用于单词左右两侧
1
|
# grep -E '\broot\b' /etc/passwd |
( ) 分组, (基本正则表达式中 \(\) ) 将任意个字符当前同一个组件
1
2
3
4
|
# cat grep.txt abxy xxxxxxy xyxyxyxyabcxy |
1
|
# grep -E '(xy)+' grep.txt |
注意:
表示字符串本身时,如果使用的命令使用的正则表达式字符,有\,则不用\; 如果没有\,则加\。
1
|
# grep -o '[[:alpha:]_]\+()' /etc/rc.d/init.d/functions #正则表达式字符为 \( \) |
1
|
grep -E -o '[[:alpha:]_]+\(\)' /etc/rc .d /init .d /functions #扩展正则表达式字符为 ( )
|
后向引用,分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3
1
|
# grep -E '(^[[:alnum:]]+\>).*\1$' /etc/passwd |
或
[cCat] c或C或a或t
c|Cat c或Cat
(c|C)at cat 或 Cat
1
2
3
4
5
6
|
# vim dsdcI.txt cat Cat c12 C123 at |
1、[cCat] 匹配指定范围内的任意单个字符
1
|
# egrep '[cCat]' dsdcI.txt |
2、c|Cat 匹配c 或 Cat
1
|
# egrep 'c|Cat' dsdcI.txt |
3、(c|C)at 匹配 cat 或 Cat
1
|
# egrep '(c|C)at' dsdcI.txt |
总结:
打印匹配到的字符所在的行
egrep与grep元字符相同的使用
. [ ] [^] \< \> \b ^ $ * .*
egrep与grep元字符的不同使用
grep
\?
\+
\{m,n\}
\(\)
egrep
?
+
{m,n}
()
|
egrep 或 “grep并不支持”
[abcd] 字符级别的或
c|cat 左侧整体或右侧整体
(c|c)at 分组或