linux三剑客之grep
所谓三剑客的工具有“grep”、“sed” 、“awk”,他们都是不谋而合的文本搜索查找处理的强大工具。grep 是 Ken Thompson 写的,他也是 Unix 的创造者。
gerp及正则表达式
grep全称(GLobal search Regular expression and print out the line 全局搜索正则表达式并打印到命令行)
grep是文本搜索工具,根据用户指定的“模式”(过滤条件),对目标文本逐行进行匹配并打印到命令行界面
模式:由正则表达式的元字符及文本符所编写的过滤条件
grep又分为grep、egrep、fgrep;其中grep支持基本正则表达式,egrep支持扩展正则表达式,fgrep则不支持正则表达式;至于为什么要分的那么多,因为linux系统上有很多工具,而有的工具只支持基本正则表达式进行搜索,有的却支持扩展正则表达式,至于fgrep则是用来匹配不用 “模式 ” 作为过滤条件的工具,fgrep的搜索速度比前两者快很多。
grep的使用
命令格式:
grep [OPTIONS] PATTERN [FILE…]
选项 模式 查找的文件
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
-e:逻辑或 -f:在文件中调用模式来匹配
命令选项:
–color=auto :对匹配到的文本高亮显示
-i :忽略字符大小写
在搜索时不区分字符的大小写
-o:仅显示匹配到的文本字符本身
搜索到匹配的字符串时只显示字符串本身,同行的其他字符不显示
-v:仅显示不能被匹配到的行
显示不能匹配到的其他行,被匹配到的不显示
-q:静默模式,即不输出任何信息
用于测试,常用于在脚本中用于判断是否能匹配,并不关心匹配到的值
-n:给匹配到的字符所在行添加行号
给匹配到的字符所在行进行标记,行号为字符所在文本中的行数
-c:统计匹配到的行的行数
计算出匹配到的字符的所有行总数,只显示总数
-e:逻辑或
同时匹配多个条件时使用一个条件前加一个-e选项
-w:匹配的字符串为整个单词
匹配时不以字符进行匹配,必须为单独的一个单词才能匹配到
-A:显示匹配到的行的前N行(N为要显示的行数)
显示匹配到的行的前面几行
-B:显示匹配到的行的后N行(N为要显示的行数)
显示匹配到的行的后面几行
-C:显示匹配到的行的前后N行(N为要显示的行数)
显示匹配到的行的前面和后面几行
-E:使用egrep进行搜索
支持扩展正则表的式进行搜索
-F:使用fgrep进行搜索
不支持正则表达式进行搜索
基本正则表达式的元字符:
用于对要匹配的字符模糊匹配,即显示出符合模式的字符,匹配方式有:字符匹配、匹配字符次数、字符串位置锚定、分组及引用
字符匹配:
模糊对字符进行大概的类型进行查找
. :任意单个字符
[ ]: 指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
其中用于[]和[^]中的还有一些常用的元字符:
[:space:] 所有空格和tab键
[:upper:] 所有大写字母
[:lower:] 所有小写字母
[:alpha:] 所有大小写字母
[:alnum:] 所有数字和大小写字母
[:digit:] 所有数字
[:punct:] 所有标点符号
注意:如[:punct:]等是一个整体,所以使用时需在加上外围内或范围外的中括号
匹配次数:
匹配要查找的字符出现过几次
*:匹配其前面的字符任意次(0、1、多次)
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次(此字符前面一个字符可有可无)
\+:匹配其前面的字符至少1次,可以多次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次(包括给定的次数)
\{0,n\}:匹配其前面的字符至多n次
\{m,\}:匹配其前面的字符至少m次
位置锚定:
对字符的位置进行锚定查找
1.对行的位置进行锚定
^: 行首锚定(用于模式的最左侧)
$:行尾锚定(用于模式的最右侧)
^PATTERN$:用PATTERN匹配整行
^$:空白行(不包括空格字符)
^[[:space:]]$:空白行(包括空格字符的行)
2.对要查找的单词进行位置锚定;单词:非特殊字符组成的字符(字符串,包括数字)
\<或\b:词首锚定,用在单词的最左侧
\>或\b:词尾锚定,用在单词的最右侧
\<PATTERN\>:用于匹配整个完整单词
注意:\b则用在要匹配单词模式的左右则即可,在左侧则为词首,右侧则为词尾
分组及引用:
分组:
\(\):将一个字符或多个字符捆绑在一起当做一个整体来进行处理,可以引用此前匹配到的结果
引用:
引用前面分组匹配到的结果;分组括号中的模式匹配到的内容会被正则表达式引擎自动记录在内部变量中,使用此变量即可调用保存的结果再次进行匹配。
变量则为:\1、\2、\3、\4………………
\1:表示模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2: 表示模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
egrep的使用
命令格式:
egrep [OPTIONS] PATTERN [FILE…]
选项 模式 查找的文件
命令选项:
–color=auto :对匹配到的文本高亮显示
-i :忽略字符大小写
在搜索时不区分字符的大小写
-o:仅显示匹配到的文本字符本身
搜索到匹配的字符串时只显示字符串本身,同行的其他字符不显示
-v:仅显示不能被匹配到的行
显示不能匹配到的其他行,被匹配到的不显示
-q:静默模式,即不输出任何信息
用于测试,常用于在脚本中用于判断是否能匹配,并不关心匹配到的值
-n:给匹配到的字符所在行添加行号
给匹配到的字符所在行进行标记,行号为字符所在文本中的行数
-c:统计匹配到的行的行数
计算出匹配到的字符的所有行总数,只显示总数
-w:匹配的字符串为整个单词
匹配时不以字符进行匹配,必须为单独的一个单词才能匹配到
-A:显示匹配到的行的前N行(N为要显示的行数)
显示匹配到的行的前面几行
-B:显示匹配到的行的后N行(N为要显示的行数)
显示匹配到的行的后面几行
-C:显示匹配到的行的前后N行(N为要显示的行数)
显示匹配到的行的前面和后面几行
-F:使用fgrep进行搜索匹配
不支持正则表达式进行搜索
-G:使用grep进行搜索匹配
支持正则表达式进行搜索
扩展正则表达式的元字符:
用于对要匹配的字符模糊匹配,即显示出符合模式的字符,匹配方式有:字符匹配、匹配字符次数、字符串位置锚定、分组及引用
字符匹配:
模糊对字符进行大概的类型进行查找
. :任意单个字符
[ ]: 指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
其中用于[]和[^]中的还有一些常用的元字符:
[:space:] 所有空格和tab键
[:upper:] 所有大写字母
[:lower:] 所有小写字母
[:alpha:] 所有大小写字母
[:alnum:] 所有数字和大小写字母
[:digit:] 所有数字
[:punct:] 所有标点符号
注意:如[:punct:]等是一个整体,所以使用时需在加上外围内或范围外的中括号
匹配次数:
匹配要查找的字符出现过几次
*:任意次
?:匹配其前面的字符0次或1次(此字符前面一个字符可有可无)
+:匹配其前面的字符至少1次,可以多次
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次(包括给定的次数)
{0,n}:匹配其前面的字符至多n次
{m,}:匹配其前面的字符至少m次
位置锚定:
对字符的位置进行锚定查找
1.对行的位置进行锚定
^: 行首锚定(用于模式的最左侧)
$:行尾锚定(用于模式的最右侧)
^PATTERN$:用PATTERN匹配整行
^$:空白行(不包括空格字符)
^[[:space:]]$:空白行(包括空格字符的行)
2.对要查找的单词进行位置锚定;单词:非特殊字符组成的字符(字符串,包括数字)
\<或\b:词首锚定,用在单词的最左侧
\>或\b:词尾锚定,用在单词的最右侧
\<PATTERN\>:用于匹配整个完整单词
注意:\b则用在要匹配单词模式的左右则即可,在左侧则为词首,右侧则为词尾
分组及引用:
分组:
():将一个字符或多个字符捆绑在一起当做一个整体来进行处理,可以引用此前匹配到的结果
引用:
引用前面分组匹配到的结果;分组括号中的模式匹配到的内容会被正则表达式引擎自动记录在内部变量中,使用此变量即可调用保存的结果再次进行匹配。
变量则为:\1、\2、\3、\4………………
\1:表示模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2: 表示模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
或:
| :前一个或者后一个
fgrep:不支持正则表达式元字符
当不需要用到元字符去进行匹配字符时,使用fgrep速度更快
练习题:
1、显示当前系统root、 mage或wang用户的UID和默认shell
[root@localhost /]# egrep "^(root|wang|mage)\b" /etc/passwd | cut -d: -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
[root@localhost /]# grep "^[[:alnum:]_].*()" /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost testdir]# echo "/etc/aa/bb/" | egrep "[^/]+*/?$"
4、使用egrep取出上面路径的目录名
[root@localhost testdir]# echo "/etc/aa/bb" | egrep "^[^[:alnum:]]+.*/"
6、显示ifconfig命令结果中所有IPv4地址
ifconfig | egrep --color=auto "(\b([1-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b)"
7、显示/proc/meminfo文件中以大小s开头的行; (要求:使用两种方式)
[root@localhost testdir]# grep "^[S|s]" /proc/meminfo [root@localhost testdir]# grep -i "^s" /proc/meminfo
8、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@localhost testdir]# grep -v "/bin/bash$" /etc/passwd
9、显示用户rpc默认的shell程序
[root@localhost testdir]# grep "^\brpc\b" /etc/passwd | cut -d: -f3,7
10、找出/etc/passwd中的两位或三位数
[root@localhost testdir]# grep "\([[:digit:]]\)\{2,3\}" /etc/passwd
11、显示/etc/grub.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
[root@localhost testdir]# grep "^[[:space:]].*[^[:space:]]" /etc/grub.conf
12、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、 1或多个空白字符结尾的行
[root@localhost testdir]# netstat -tan | grep "\bLISTEN[[:space:]]*$"
13、找出/etc/passwd文件中用户名同shell名的行
[root@localhost /]# egrep "^(\<.*\>)+.*\1$" /etc/passwd [root@localhost testdir]# egrep "^([[:alpha:]]+):.*\1$" /etc/passwd
14、用正则表达式表示IP地址
[root@localhost testdir]# ifconfig | egrep --color=auto -o "(\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|2[0-2][0-3]])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\b)"
15、用正则表达式表示手机号11 13 17 15 18
egrep "\b1[345678][0-9]{9}\b"
原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/29892