一 简介
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
正则表达式:又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
二 grep用法
1.grep 常用选项:
-v: 显示不包含匹配文本的所有行。
-o: 仅显示匹配的字串,而非字串所在的行
-i: 忽略字符大小写
-n:输出匹配行的行号
-q:安静模式,不打印任何标准输出
-E: 扩展正则表达式,相当于egrep,egrep 扩展正则表达式
-F:固定字符串列表,相当于fgrep,fgrep 不支持正则表达式
-A:显示被模式匹配到的行及后#行
-B:显示被模式匹配到的行及前#行
-C:显示被模式匹配到的行及其前后各#行
–color=auto :可以将找到的关键词部分加上颜色的显示
2.正则表达式:
a.字符匹配:
. : 匹配任意单个字符,相当于通配符?;
[] : 匹配指定范围内的任意单个字符;
[^] : 匹配指定范围外的任意单个字符;
b.常用特殊字符匹配:
[0-9] = [[:digit:]] :匹配数字
[a-z] = [[:lower:]] : 匹配小写字母
[0-9a-zA-Z] = [[:alnum:]] : 匹配大小写字母或数字
[a-zA-Z] = [[:alpha:]] : 匹配字母,大小写字母
[[:space:]] = \s : 匹配空白字符
[A-Z] = [[:upper:]] = : 代表大小字写母
c. 次数匹配:
* :匹配*前面的单个字符任意次,可以为0次;
.*:匹配任意长度的任意字符;
\?:匹配?前面的字符0或者1次;如果是使用egrep 直接?
\+:匹配+前面的字符至少1次;如果是使用egrep 直接+
\{m,n\}:匹配其左侧的字符至少m次,至多n次;如果是使用egrep 直接{m,n}
\{m,\}:匹配其左侧的字符至少m次 如果是使用egrep 直接{m,}
\{0,n\}:匹配其左侧的字符至多n次 如果是使用egrep 直接{0,n}
\{m\}:精确匹配其左侧的字符m次 如果是使用egrep 直接{m}
d. 位置锚定:
^ :锚定行首
$ : 锚定行尾
^$ :匹配空白行,^[[:space:]]$ 一样的效果
e.单词锚定:
\< :锚定词首
\>:锚定词尾
\<PATTERN\>:匹配PATTERN能匹配到的整个单词
\b:匹配一个字边界,即字与空格间的位置
|: 或的意思 a|b 就是匹配a或者是b
f.分组及引用:
\(\) :将()中字符集合到一起作为一个字符引用,如果是使用egrep 直接()
\#:引用,模式中自左而右,而非模式本身
3.正则表达式的贪婪与非贪婪模式
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
三 例子
1.将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
grep -n root /etc/passwd
2.用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示:
grep -n root /etc/passwd
3.将/etc/passwd,将没有出现 root 的行取出来
grep -v root /etc/passwd
4.用 dmesg 列出核心信息,再以 grep 找出内含 eth0 那行,在关键字所在行的前两行与后三行也一起捉出来显示
dmesg | grep -n -A3 -B2 'eth0'
5.搜索cc.txt下aa 关键字忽略字母大小写,命令如下:
grep -i ‘aa' cc.txt
6.在/etc/passwd 查找以root开头的行
grep "^root" /etc/passwd
7.在/etc/passwd 查找以nologin结尾的行
grep "nologin$" /etc/passwd
创建一个测试文件内容如下
8. 在siaz.txt 文件中匹配以the作为单词首部的行
grep "\<the" siaz.txt
9.在siaz.txt 文件中匹配以the作为单词词尾的行
grep "the\>" siaz.txt
10.在siaz.txt 文件中匹配/etc/passwd中包含单词"the"的行
grep "\bthe\b" siaz.txt
11.在/etc/passwd中 匹配单个字符 r..t
grep "r..t" /etc/passwd
12.匹配0个或多个重复位于星号前的字符 :从/etc/passwd中匹配rt、rot、root、roo*t
grep 'ro*t' /etc/passwd
13.匹配一组字符中的任意一个, 从/etc/passwd中匹配包含test1或best的行
grep "[tb]est" /etc/passwd
14.匹配/etc/passwd中不包含root的行
grep "^[^root]" /etc/passwd ([^root] 取非root字符,^ 开头非root的行)
15.匹配/etc/passwd中字母o连续出现2次的行
grep "o\{2\}" /etc/passwd
grep -E "o{2}" /etc/passwd
测试文件bb.txt 内容如下
16.匹配文件bb.txtx 中 最少出现m次,最多出现n次
grep "ro\{2,4\}" bb.txt
grep -E "ro{2,4}" bb.txt
分组测试文件cc.txt 内容如下
17.匹配cc.txt文件中以2016开头且以2016结尾的行
grep "^\(2016\).*\1$" cc.txt
grep -E "^(2016).*\1$" cc.txt
18.在cc.txt 文件中分组引用w(es)t 中的es
grep "w\(es\)t.*\1" cc.txt
grep -E "w(es)t.*\1" cc.txt
19.匹配cc.txt文件中的数字与大小写字母
grep "[[:alnum:]]" cc.txt
grep "[0-9a-Z]" cc.txt
20.匹配cc.txt文件的空白键
grep "[[:space:]]" cc.txt
21.从/etc/passwd中匹配包含ro字符串,且字母至少出现一次以上的行
grep -E "ro+" /etc/passwd
22.在bb.txt 文件中,匹配其roo前导字符0次或1次
grep -E "roo?" bb.txt
23.从/etc/passwd中匹配test1或best1
grep "[t|b]est1" /etc/passwd
24.在/etc/passwd上查找用户id和组id在500到1099之间的行
grep "\<1\?[05][0-9][0-9]\>" /etc/passwd
grep -E "\<1?[05][0-9][0-9]\>" /etc/passwd
25.找出ifconfig命令结果中的1-255之间的数字
ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
26.显示/etc/passwd文件中其默认shell为/bin/bash的用户
grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1
原创文章,作者:liangkai,如若转载,请注明出处:http://www.178linux.com/11156
评论列表(1条)
[…] 转载:linux运维部落 » grep,egrp,fgrep 命令与正则表达式 […]