grep
Linux上文本处理三剑客
grep:文本过滤(模式:pattern)工具;
grep, egrep, fgrep :正则表达式,扩展正则,(快速grep)
sed:stream editor,文本编辑工具;
awk:Linux上的实现gawk,文本报告生成器;
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件;
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep
正则表达式引擎
grep [OPTIONS] PATTERN [FILE...]
选项:
--color=auto: 对匹配到的文本着色显示;
grep --color=auto root /etc/passwd=查找/etc/passwd中出现root的行
-v: 显示不能够被pattern匹配到的行;
grep -v root /etc/passwd
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
grep -o root /etc/passwd
-q: 静默模式,不输出任何信息;
-A #:after, 后#行,-A 2=显示匹配行和匹配行的后两行
-B #: before, 前#行
-C #:context, 上下文前后各#行
-P:
-E:使用ERE扩展正则表达式;
基本正则表达式元字符:
1.字符匹配:
. :匹配任意单个字符; grep 's..n' /etc/passwd
[] :匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
任意数字 小写字母 大写字母 大小写字母 数字字母 标点符号 空格
使用时要在外面加中括号 [[:digit:]]
grep '[[:alpha:]][[:alpha:]][[:alpha:]]t' /etc/passwd
相当于 grep '[[:alpha:]]{3}t' /etc/passwd
2.匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
*:匹配前面的字符任意次;
例如: grep "x*y" =表示 y 前面可以出现任意多的 x, y 必须在
abxy --匹配
xay --匹配
xxxxxxy --匹配
aaaay --匹配
贪婪模式 grep "x*\?y" /tmp/zhangxu/a.txt 能匹配到以上相同的结果
.*:任意长度的任意字符;
grep "a.*y" /tmp/zhangxu/a.txt ab必须都在
\?:匹配其前面的字符0或1次;即前面的可有可无;
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
grep '[[:alpha:]]\{3\}t' /etc/passwd 在t前面出现3个任意字母
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次,至多不限;
3.位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$:用于模式匹配整行;
^$:空行;
^[[:space:]]*$
\< 或 \b:词首锚定;用于单词模式的左侧;
\> 或 \b:词尾锚定;用于单词模式的右侧;
\<PATTERN\>:匹配整个单词;
4.分组:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,
这些变量的命名方式为: \1, \2, \3, ...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy 第二个括号
后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)