1、絮叨
Linux上文本处理三剑客:
grep, egrep, fgrep:文本过滤工具(模式:pattern)工具; grep:基本正则表达式,-E,-F
egrep:扩展正则表达式, -G,-F fgrep:不支持正则表达式
sed:stream editor, 流编辑器;文本编辑工具;
awk:Linux上的实现为gawk,文本报告生成器(格式化文本);
这三个工具全部都会用到正则表达式,什么是正则表达式,有什么用?正则表达式:Regual Expression,简写为REGEXP
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
分两类:
基本正则表达式:BRE basic扩展正则表达式:ERE extend
2、概念
grep:
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
正则表达式模式的实现或者能够搜索正则表达式都要用到正则表达式引擎
正则表达式引擎;
grep [OPTIONS] PATTERN [FILE…] PATTERN 模式
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…] 可以把模式写到一个文件中通过-f读
取,然后对file进行过滤
3、常见选项:
1. --color=auto:对匹配到的文本着色后高亮显示;
2. -i:ignorecase,忽略字符的大小写;
3. -o:仅显示匹配到的字符串本身;
4. -v, --invert-match:显示不能被模式匹配到的行;
5. -E:支持使用扩展的正则表达式元字符;
6. -q, --quiet, --silent:静默模式,即不输出任何信息;
7. -n,显示行号
4、基本正则表达式元字符
字符匹配
首先我们来看字符匹配
- . :匹配任意单个字符; 类似glob中的? Grep “r…t” /etc/passwd
- []:匹配指定范围内的任意单个字符;
- [^]:匹配指定范围外的任意单个字符; 脱字符
- [:digit:]、数字[:lower:]、小写字母[:upper:]、大写字母[:alpha:]所有字母、[:alnum:]数字和 字母、[:punct:]所有标点符号、[:space:] 空格
例:
grep “r[[:alpha:]][[:alpha:]]t” /etc/passwd rt 【表示中间匹配两个字母】
那如果我们要匹配很多个字母呢?全部打上去?
接下来就到我们匹配次数出场了
匹配次数
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
- *:匹配其前面的字符任意次;0,1,多次;
- .*:匹配任意长度的任意字符
- \ ?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;【注:\与?之间没有空格】
- \ +:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;【同上】
接下来我们看更高级的,上面都是匹配任意多次,那我只想要匹配8次呢?那就来看看下面这个可以指定精确次数匹配的吧!><
- \ {m\ }:匹配 其前面的字符m次; Grep “x\ {1\ }y”
- \ {m,n\ }:匹配其前面的字符至少m次,至多n次;
- \ {0,n\ } :至多n次
- \ {m,\ } :至少m次
位置锚定
-
^:行首锚定;用于模式的最左侧; 脱字符
例:
Grep “^root” /etc/passwd -
: 行 尾 锚 定 ; 用 于 模 式 的 最 右 侧 ; G r e p " r o o t :行尾锚定;用于模式的最右侧; Grep "root :行尾锚定;用于模式的最右侧;Grep"root" /etc/passwd
-
^PATTERN$:用于PATTERN来匹配整行;
-
^$:空白行;
-
1*$:空行或包含空白字符的行;
-
\ < 或\b:词首锚定,用于单词模式的左侧; Grep “\ <root” /etc/passwd
-
\ >或\b:词尾锚定,用于单词模式的右侧; Grep “root\ >” /etc/passwd
-
\ <PATTERN\ >:匹配完整单词; Grep “\ <root\ >” /etc/passwd
分组及引用
- \ ( \ ):将一个或多个字符捆绑在一起,当作一个整体进行处理;
- \ (xy \ )*ab 命令行中括号有特殊意义所以用转义符 \
- Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3
. …
括号可以嵌套不能交叉
[:space:] ↩︎