Linux家族关于文本处理的工具有三个,他们分别为grep、awk和sed,今天我就介绍一下grep文本处理工具。
首先,什么是grep呢?
grep是一种文本搜索工具,基于“pattern”对给定文本进行搜索过滤,并对目标文本进行检查,并打印出符合条件的文本的一款文本处理工具。说到pattern,那么pattern又是什么呢?那就是大家所熟知的“正则表达式”。
grep家族又有三个成员:grep,egrep和fgrep。
grep: 支持正则表达式。
egrep:支持使用扩展的正则表达式。
fgrep:不支持使用正则表达式。
grep:grep [OPTIONS] PATTERN [FILE...],这个是grep使用时的语法,指的是
grep + 选项 + 正则表达式 + 文本文件
grep -i :忽略字符大小写
~]# grep -i ‘uuid‘ /tmp/fstab UUID=17caf342-d579-4dad-a16c-cf39353271c9 / UUID=7ddc4cb3-07a9-47be-8273-afbded7b46e3 /boot
grep -o:仅显示匹配到的文本的自身
~]# grep -o‘^UUID‘ /tmp/fstab UUID UUID
grep -v:反向匹配
~]# grep -v"bash$" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
基本正则表达式元字符
字符匹配:
.:匹配任意单个字符
~]# grep ‘p.‘ /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[]:匹配范围内的任意单个字符:
~]# grep "[a]" /etc/fstab # /etc/fstab # Created by anaconda on Sun Feb 28 11:21:11 2016
[^]:匹配范围外的任意单个字符
说到范围,就简单的介绍一下特殊符号:
[:alpha:]:代表任何英文字母(不区分大小写) [:digit:]:代表所有数字
[:lower:]:代表所有的小写字母 [:upper:]:代表所有的大写字母
[:alnum:]:代表所有英文大小写和数字 [:space:]:任何会产生空白的字符
[:punct:]:代表标点符号 [:blank:]:代表空格键和Tab键
如果我们要取/etc/passwd下非字母的文本,即
~]# grep "[^[:alpha:]]" /etc/fstab # #/etc/fstab #Created by anaconda on Sun Feb 28 11:21:11 2016
匹配次数:
*:匹配前面的字符任意次(0,1或者多次)
~]# grep "o*t" /etc/passwd root:x:0:0:root:/root:/bin/bash shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.*:任意长度的任意字符
\+:匹配前面的字符至少1次
~]# grep "o\+t" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
\{m\}:其前面的字符出现m次,m为非负整数
~]# grep "o\{2\}t" /etc/passwd root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin
位置锚定:
^:锚定行首,也就是最左侧 $:锚定行尾,即最右侧
~]# grep -i "^c" /etc/passwd colord:x:998:996:User for colord:/var/lib/colord:/sbin/nologin chrony:x:996:994::/var/lib/chrony:/sbin/nologin
以上就是c开头并且在行首的句子呗选出来了
行尾锚定与行首锚定的用法大体相同,不过是将反三角号去掉,在行尾加上一个$("X$")
egrep:
什么是egrep呢?其实egrep就是支持使用扩展正则表达式的grep命令,也就是grep -E。
egrep也有着属于自己的扩展正则表达式的元字符
首先字符匹配:
.:代表任意单个字符
~]# egrep ‘r..t‘ /etc/passwd root:x:0:0:root:/root:/bin/bash ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
只要有r和t的都会被找出来,其中是两个字符,所以最后一行的r/ft也会被选出来
[]:匹配范围内的任意单个字符
~]# grep "[abc]" /etc/fstab # /etc/fstab # Created by anaconda on Sun Feb 28 11:21:11 2016
上面只要有abc其中一个字符,就会被选出来。
[^]:代表匹配范围外的任意字符,用法与[]用法基本一样。
[]与[^]都可以使用之前提到的[:alpha:][:lower:]等等的范围。
匹配次数:
*:匹配任意次
?:匹配0次或者1次
+:匹配一次或者多次
以上三种都与grep中的用法是一样的,在这里会说一下匹配具体次数的:
{m}:匹配m次 {m,n}:最少匹配m次,最多匹配n次
{0,n}:最多匹配n次 {m,}: 最少匹配m次
~]# egrep "o{1,3}" /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
上面就是以找出最少一个o,最多三个o的为例子来说明的。
接下来就是位置锚定了:
^:锚定行首 $:锚定行尾 \<, \b:锚定词首 \>, \b:锚定词尾
行首行尾的锚定与grep的用法一样,在这里说一说词首词尾的锚定,在此就以词首锚定为例来说明。
~]# egrep "\<s" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
以上就是正则表达式的一些基本用法,要熟练的使用这则表达式去查找本文文件,同时也要分清什么时候用到grep,什么时候用到egrep,也要多多去练习,才能彻底掌握grep。
本文出自 “11275479” 博客,请务必保留此出处http://11285479.blog.51cto.com/11275479/1750330
原文地址:http://11285479.blog.51cto.com/11275479/1750330