linux基础三剑客之grep
1、grep命令
基本介绍
grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrep个fgrep。
grep英文名:Global search Regular expression and Print out the line
grep命令的作用:文本所搜工具。根据用户指定的模式对目标文件逐行进行匹配检查,并且打印匹配的行
模式:由正则表达式字符串及文本字符所编写的过滤条件
正则表达式:英文名regular expression,解释:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或者通配的功能
正则表达式分类
基本正则表达式:basic regular expression,简写BRE
扩展正则表达式:extend regular expression,简写ERE
注意:grep默认支持的是基本正则表达式,但是grep命令可以是用选项-E来使用扩展正则表达式。egrep命令默认支持扩展正则表达式
正则表达式引擎:检查一个模式是否匹配一段文本信息的程序,不同的编程语言使用的正则表达式引擎可能不同。引擎不同,检查字符匹配的算法不同。
grep命令内部自带了正则表达式引擎来实现文本的检查
基本语法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用选项
--color-auto:对匹配的文本内容进行着色
-v:显示不能够被pattern匹配的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串
-q:对匹配或者不匹配的内容不输出任何信息,表示是静默模式
-A num:显示匹配到的行及在这之后多显示num行
-B num:显示匹配到的行及在这之前多显示num行
-C num:显示匹配到的行及在这之前和之后显示num行
-E:使用扩展正则表达式
-F:使用固定字符正则表达式
-G:表示使用基本正则表达式
-P:表示使用perl正则表达式
基本正则表达式的元字符
字符匹配元字符
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配范围之外的任意单个字符
也支持字符集范围表示
[:digit:]、[:alnum:]、[:alpha:]、[:lower:]、[:upper:]、[:punct:]
使用案例
[root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt hal kde lvm ntp opt pki ppp rpc rpm ssh ssl xdg xml yum qwe
匹配次数元字符
基本介绍
用在要指定次数的字符后边,用于指定前面的字符要出现的次数
匹配次数元字符
*:匹配前面的字符0次或者多次
使用案例
[root@oldboy ~]# grep "x*y" grep.txt xay xbby
?:匹配前面的字符0次或者1次
. *:匹配任意长度字符
+:匹配前面字符至少一次
{m}:匹配前面的字符m次。
{m,n}:匹配掐面字符至少m次,至多n次
{m,}:匹配前面字符至少m次,多则不限
{0,n}:匹配前面的字符至多n次
使用注意
为什么要使用?-----因为?问号、加号+、大括号{}在linux中的bash解释器中有特殊意义,用反斜线在意就让他表示?问号原来的意义,即?问号在bash中表示任意字符,{}大括号在bash中表示内容展开,因此为了避免在bash中被解释,那么使用反斜线转义
位置锚定元字符
基本介绍
要求指定的字符串模式必须出现在特定位置,那么得使用位置锚定元字符
位置锚定元字符有
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行
^$:匹配空行
^[[:space:]]*$:匹配整行为空格行或者空行
<或者:单词的词首锚定,用于单词模式的左侧
>或者:单词的词尾锚定,用于单词模式的右侧
<PATTERN>:单词锚定,用于匹配整个单词
分组
():用于将一个后者多个字符串捆绑在一起,当做一个整体进行处理,小括号在bash中也表示特殊符号
后项引用:引用前面的分组括号中的模式所有匹配的字符(并不是引用匹配的模式,而是引用的匹配模式下的字符串)
案例演示:
[root@oldboy ~]# grep "(<[[:alpha:]]{1,3}t>).*1" /etc/passwd root:x:0:0:root:/root:/bin/bash halt:x:7:0:halt:/sbin:/sbin/halt
使用注意:
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:1,2,3...
1:表示第一次被分组小括号所匹配的内容
2:表示第二次被分组小括号所匹配的内容
.....
举例:
(ab+(xy{2,}))*
1匹配上面的:ab+(xy)
2匹配上面的:xy{2,}
使用注意
grep命令默认使用的是贪婪模式匹配,即最大匹配。
为什么要使用位置锚定符?
grep正则匹配默认是每一行按照正则模式一个字符一个字符的匹配,那么有匹配的字符串可能出现在一行内容的任意位置,因此,如果我们有需求要匹配的字符串在指定的位置(比如:在行首、行尾、词首、词尾),那么就得使用位置锚定元字符
单词:在linux正则表达式中表示由特殊符号分割的一个字符串,纯数字字符串也算一个单词(虽然在显示不算真正意义的单词)
案例演示题库
显示/proc/meminfo文件中以大小写a、b开头的行
[root@oldboy ~]# grep -i "^a" /proc/meminfo Active: 38640 kB Active(anon): 19756 kB Active(file): 18884 kB AnonPages: 19592 kB AnonHugePages: 0 kB [root@oldboy ~]# grep "^[aA].*" /proc/meminfo Active: 38612 kB Active(anon): 19720 kB Active(file): 18892 kB AnonPages: 19592 kB AnonHugePages: 0 kB
显示/etc/passwd文件中不以/bin/bash结尾的行
[root@oldboy ~]# grep -v "/bin/bash$" /etc/passwd
显示/etc/passwd文件中GID最大的用户名
[root@oldboy ~]# sort -t: -k3 -n /etc/passwd|tail -n 1 www:x:515:518::/home/www2:/bin/bash [root@oldboy ~]# sort -t: -k3 -n /etc/passwd|tail -n 1|cut -d: -f1 www
显示/etc/passwd的oldboy用户是否存在,如果存在显示他的默认shell
[root@oldboy ~]# grep "^<oldboy>" /etc/passwd oldboy:x:500:515:lan:/home/oldboy:/bin/csh [root@oldboy ~]# grep "^<root>" /etc/passwd && grep "^<root>" /etc/passwd|cut -d: -f7 root:x:0:0:root:/root:/bin/bash /bin/bash
显示/etc/passwd文件中UID是三位数的用户名
[root@oldboy ~]# grep "<[[:digit:]]{3}>" /etc/passwd [root@oldboy ~]# grep "<[[:digit:]]{3}>" /etc/passwd|cut -d: -f1
显示netstat -tan中出现State是LISTEN的行
[root@oldboy ~]# netstat -tan|grep "LISTEN[[:space:]]*" tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:631 :::* LISTEN
显示/etc/passwd文件中用户名与默认shell名相同的行
[root@oldboy ~]# grep "(<[[:alnum:]]+>).*1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:516:519::/home/bash:/bin/bash
2、egrep命令
基本介绍
扩展正则表达式
egrep = egrep -E
基本语法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
扩展正则表达式的元字符
字符匹配
.:匹配任意一个字符
[]:匹配范围内的字符
[^]:匹配范围外的字符
次数匹配
*:匹配0次或者多次
?:匹配0次或者1次
+:匹配1次或者多次
{m}:匹配m次
{m,n}:匹配至少m次,至多n次
锚定字符
^:锚定行首
$:锚定行尾
<:锚定词首
>:锚定词尾
分组
()
后项引用变量1,2,3....
或者
a|b:支持二选一(扩展正则表达式比基本正则表达式元字符多了二选一)
练习问题
显示当前系统能够root、centOS或者oldboy用户的默认shell和UID
[root@oldboy ~]# grep -E "^(root|centos|oldboy)>" /etc/passwd root:x:0:0:root:/root:/bin/bash oldboy:x:500:515:lan:/home/oldboy:/bin/csh
找出/etc/rc.d/init.d/functions文件中,某单词跟一个小括号的行
[root@oldboy~]#egrep "^<[_[:alpha:]]+>[[:space:]]*()" /etc/rc.d/init.d/functions
使用echo命令输出一个命令,使用egrep取出路径的基名(基名:整个路径的最后一个文件或者目录)
[root@oldboy ~]# echo "/etc/fstab" |grep -E -o "[^/]+/?>$" fstab
找出ifconfig命令结果中的IP地址
[root@oldboy ~]# ifconfig|grep -E -o "(<[[:digit:]]+>.?){3}.?[[:digit:]]+" 192.168.173.140 192.168.173.255 255.255.255.0 127.0.0.1 255.0.0.
找出ifconfig命令结果中的1-255的数值
[root@oldboy ~]# ifconfig | grep -E -o "<[0-5]+>"|sort -u -n 00 1 2 3 50 140 255 1000 1500
使用注意
如果是扩展正则表达式,那么它的匹配模式的扩展正则元字符有一些不用转义,比如:小括号,大括号,加号等,但是锚定词首和词尾都需要加转义字符
3、fgrep命令
基本介绍
fgrep命令不支持正则表达式搜索,你搜索字符是什么,就按照你搜索的去匹配
基本语法
grep [OPTIONS] [-f PATTERN] [FILE...]
基本使用
[root@oldboy ~]# grep -F "a..t" fgrep.txt a..t [root@oldboy ~]# grep -F "^h" fgrep.txt ^h