概念:
grep (Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep:传统的grep程序,支持基本正则表达式
egrep:扩展的grep程序,支持扩展正则表达式
正则表达式:简单来说就是,用一串自己定义的条件字符串,去匹配检索文档中符合条件的字符。
grep基本格式:
grep [OPTIONS] PATTERN [FILE...]
常用选项:
-i:(ignore case) 搜索时不区分字符大小写
-v:显示不能够被模式匹配到的行
-E:使用扩展正则表达式
-A #:显示被模式匹配到的行以及下#行
-B #:显示被模式匹配到的行以及上#行
-C #:显示被模式匹配到的上下#行
--color[=WHEN],--colour[=WHEN] :
用于设置匹配到的字符,显示高亮颜色否,有三个选项auto ,always ,never
例如:
基本正则表达式元字符:
字符匹配:
. :匹配任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数
* :任意长度,表示0次,1次或多次;
.*:任意长度的任意字符(工作于贪婪模式,尽可能长的进行匹配)
\?:匹配其前的字符0次或1次,表示其左侧字符可有可无
\+:匹配其前面的字符1次或多次,表示其左侧字符至少出现一次
\{m\}:精确匹配其左侧字符出现m次
\{m,n\}:至少m次,至多n次:
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:锚定行首,形如:^PATTERN
$:锚定行尾,形如:PATTERN$
^PATTERN$:用模式来匹配整行
例如:
grep "^$" 匹配空白字符的行(有空格的行不能匹配)
grep "^[[:space:]]*$" 匹配所有空行(可以有空格)
grep "^sh.*sh$" /etc/passwd 匹配/etc/passwd文件中以sh开始,sh结尾的整行
单词锚定:由非特殊字符组成的连续的字符串
\<:锚定词首 也可用\b,形如:\<PATTERN \bPATTERN
例如:grep "\<sh" /etc/passwd 匹配/etc/passwd文件中以“sh”开头的单词
\>:锚定词尾,也可以用\b,形如:PATTERN\> PATTERN\b
\<PATTERN\>:匹配PATTERN能匹配的整个单词
分组匹配:
\(PATTERN\)
注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量时\1,\2,...),因此,还可以被引用
\1:引用,模式中左到右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容
\2:引用,模式自左而右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容
例如:
grep"\(a.b\).*\1" FILE.. 用于匹配文件行中出现了"a.b",且后面再次出现了前方“a.b”匹配到的相同字符串
如图:
amb hello amb 匹配
amb hello anb 不匹配 \1匹配的是前面匹配到的内容amb,而非\(a.b\)模式
扩展的正则表达式元字符:(无特殊说明则用法和基本正则表达式相同)
字符匹配:
. :匹配任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配:
*:任意次
?:0或1次
+:至少1次
{m}:精确匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
位置锚定:
^:行首
$:行尾
\<,\b:词首
\>,\b:词尾
^$:空白行
分组:
(PATTERN):引用\1,...
或者:(两侧的所有内容)
a|b :a或者b
abc|CBA: abc或者CBA
egrep(grep -E)命令:(基本和grep一样)
grep -E PATTERN FILE...
egrep PATTERN FILE...
练习:
1.显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i "^s" /proc/meminfo --color=auto 或;
# grep "^[sS]" /proc/meminfo --color=auto
用扩展正则表达式书写:
# egrep -i "^s" /proc/meminfo --color=auto
2.显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
# grep -v "nologin$" /etc/passwd ;-v 显示不被匹配到的行
用扩展正则表达式书写:
# grep -E -v "nologin$" /etc/passwd ;-E 表示使用扩展正则表达式
#grep "^\(.*\)\>.*\1$" --color=auto /etc/passwd
用扩展正则表达式书写:
#grep "^(.*)\>.*\1$" --color=auto /etc/passwd