文本处理三剑客之grep
grep作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。
grep家族总共有三个:grep,egrep,fgrep。
grep :文本过滤( 模式:pattern) 工具
grep是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep:基本正则表达式
语法: grep 选项(查找模式) 参数
选项: -E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,
-c :显示总共有多少行被匹配到了,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
参数:指定匹配的文件
实例:
# ifconfig ens33 | grep netmask # 匹配ens33网络配置的netmask行内容
# grep -l "root" file1 file2 file3 # 在多个文件匹配root所在行内容
# cat test |grep -A 3 root # 显示匹配root后面的3行
# grep -v "root" file # 匹配除了root外的所有行
模式:由正则表达式字符及文本字符所编写的过滤条件
1、直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度,
比如我要匹配一下passwd文件中root的个数:grep -c "root" passwd
2、使用基本正则表达式,下面谈关于基本正则表达式的使用:
匹配字符:
. :任意一个字符。
[abc] :表示匹配一个字符,这个字符必须是abc中的一个。
[a-zA-Z] :表示匹配一个字符,这个字符必须是a-z或A-Z这52个字母中的一个。
[^123] :匹配一个字符,这个字符是除了1、2、3以外的所有字符。
对于一些常用的字符集,系统做了定义:
[A-Za-z] 等价于 [[:alpha:]]
[0-9] 等价于 [[:digit:]]
[A-Za-z0-9] 等价于 [[:alnum:]]
tab,space 等空白字符 [[:space:]]
[A-Z] 等价于 [[:upper:]]
[a-z] 等价于 [[:lower:]]
标点符号 [[:punct:]]
匹配次数:
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:行首锚定;用于模式的最左侧;grep "^root" /etc/passwd
$:行尾锚定;用于模式的最右侧;grep "root$" /etc/passwd
^PATTERN$:用于PATTERN来匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\< 或 \b:词首锚定,用于单词模式的左侧 词首;grep "\<root" /etc/passwd
\> 或 \b:词尾锚定,用于单词模式的右侧 词尾;grep "root\>" /etc/passwd
\<PATTERN\>:精确匹配完整单词;
分组及引用:
\(string\) :将string作为一个整体方便后面引用
\1 :引用第1个左括号及其对应的右括号所匹配的内容。
\2 :引用第2个左括号及其对应的右括号所匹配的内容。
\n :引用第n个左括号及其对应的右括号所匹配的内容。
egrep:扩展正则表达式
支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E
- egrep:用于在文件内查找指定的字符串
语法:egrep 选项(查找模式) 参数
选项:
-G :开启基本的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,
-c :显示总共有多少行被匹配到了,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
参数:指定匹配的文件
实例:
# egrep Linux * #在当前目录下匹配所有有关Linux的字符
模式
扩展正则表达式的元字符: 字符匹配: .:任意单个字符 []:指定范围内的任意单个字符 [^]:指定范围外的任意单个字符 次数匹配: *:任意次,0,1或多次; ?:0次或1次,其前的字符是可有可无的; +:其前字符至少1次; {m}:其前的字符m次; {m,n}:至少m次,至多n次; {0,n} {m,} 位置锚定 ^:行首锚定; $:行尾锚定; \<, \b:词首锚定; \>, \b:词尾锚定; 分组及引用: ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中; 后向引用:\1, \2, ... 或: a|b:a或者b; C|cat:C或cat (c|C)at:cat或Cat
fgrep:不支持正则表达式,
当无需要用到元字符去编写模式时,使用fgrep必能更好;