linux下grep、egrep及相应的正则表达式和用法
一、简介
Linux上文本处理三剑客(引用自马哥教育 ):
grep, egrep, fgrep:文本搜索工具;基于”pattern“对给定文本进行搜索操作;
sed:Stream EDitor,流编辑器,行编辑工具;文本编辑工具;
awk:GNU awk,文本格式化工具;文本报告生成器;
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Linux的grep家族包括grep、egrep和fgrep。
egrep命令是一个搜索文件获得模式,使用该命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子。 (转自百度百科)
二、详解
grep命令
功能说明:查找文件里符合条件的字符串。
补充说明:grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。
参 数:
--color=auto:对匹配到的文本着色后高亮显示;
-a或--text 不要忽略二进制的数据。
-c或--count 计算符合范本样式的列数。
-C<显示列数>或--context=<显示列数>或-<显示列数>
除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-i或--ignore-case 忽略字符大小写的差别。
-q或--quiet或--silent 不显示任何信息。
-v或--revert-match 反转查找。
-o:仅显示匹配 到的文本自身;
-n或--line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
-E或--extended-regexp 将范本样式为延伸的普通表示法来使用,支持扩展的正则表达式。
默认 grep 命令, 对匹配到的文本着色后高亮显示,使用 -color=auto 选项。
使用 alias 命令,查看(如图) :
用 grep命令查找 /etc/passwd 文件中 含有 “bash” 字符串的行 。
没有使用 -v 选项的效果:
使用-v选项,进行反应查找的效果:
-i:忽略字符大小写:
-q或--quiet或--silent 不显示任何信息。
-o:仅显示匹配 到的文本自身;
-c或--count 计算符合范本样式的列数。
-C<显示列数>或--context=<显示列数>或-<显示列数>
基本正则表达式元字符:
字符匹配:
.:匹配任意单个字符;
[ ]:匹配范围内的任意单个字符;
[^ ]:匹配范围外的任意单个字符;
[0-9] : 表示所有数字 等同于 [[:digit:]]
[a-z] : 表示所有小写字母 等同于 [[:lower:]]
[A-Z] : 表示所有大写字母 等同于 [[:upper:]]
[a-zA-Z] : 表示所有字母 等同于 [[:alpha:]]
[a-zA-Z0-9] : 表示字母和数字 等同于 [[:alnum:]]
[[:graph:]] : 表示非空字符(非空格、控制字符)
[[:cntrl:]] : 表示控制字符
[[:punct:]] : 表示标点符号
[[:print:]] : 表示非空字符(包含空格)
[[:space:]] : 表示空白字符
[[:digit:]] :表示所有数字
[[:lower:]] :所有小写字母
[[:upper:]] :所有大写字母
[[:alpha:]] :表示所有字母
[[:alnum:]] :表示所有 字母、数字
[[:punct:]] : 表示所有 标点 符号
匹配次数:
用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式;
*:匹配前面的字符任意次(0,1或多次);
.*:任意长度的任意字符;
\+:匹配前面的字符至少1次;
\?:匹配前面的0次或1次,即前面的字符可有可无;
\{m\}:其前面的字符出现m次,m为非负整数;
\{m,n\}:其前面的字符出现m次,m为非负整数;[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
位置锚定:
限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;
^:行首锚定;用于模式的最左侧,^PATTERN
$:行尾锚定;用于模式的最右侧,PATTERN$
^PATTERN$:要让PATTERN完全匹配一整行;
^$:空行;
^[[:space:]]*$:
单词:由非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
\<PATTERN\>:单词锚定;
^:行首锚定;
$:行尾锚定;
^PATTERN$要让PATTERN完全匹配一整行;
为了方便截图,小编 cp 了一份 passwd 到 /tmp 下,并向 passwd 添加内容:
第一行,为root。
第二行,为空白行。
"^$"为空白行,"^root$":完全匹配含有root的一整行。
^[[:space:]]*$:
表示 两边 是 任意 数字 ,中间 任意字符的 。
效果一样的。
\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
\<PATTERN\>:单词锚定;
grep的分组:
\(\)
\(ab\):表示ab整体作为匹配字符
\(ab\)* : 表示ab整体作为匹配字符,且匹配任意次
\(ab\)\{1,\}:表示ab整体作为匹配字符,且匹配至少一次
分组还可以后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\3: 引用第一个左括号以及与之对应的右括号所包括的所有内容
如test有文本内容如下:
grep "\(l..e\).*\1r" test2 表示匹配结果如下:
egrep:
支持使用扩展正则表达式的grep命令,相当于grep -E;
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
匹配次数:
*:任意次;
?:0次或1次;
+:1次或多次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
位置锚定:
^:行首
$:行尾
\<, \b:词首
\>, \b:词尾
分组及引用:
(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;
后向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
练习:
1、显示/etc/passwd文件中不以nologin结尾的行;
~]# egrep -v "nologin$" /etc/passwd
2、找出/etc/passwd文件中的含有root字符串的行;
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;
]# egrep "[^$]^[[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;
马哥的:
5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行;
6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
(一)
(二)
(三)
(四)
8、显示当前系统上root、mageedu或yu用户的相关信息;
9、echo输出一个绝对路径,使用egrep取出其基名;
~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"
10、找出ifconfig命令结果中的1-255之间的整数;
~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
11、添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户;
~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd
本文出自 “完美世界” 博客,请务必保留此出处http://angelababy.blog.51cto.com/6326130/1748736
原文地址:http://angelababy.blog.51cto.com/6326130/1748736