您的位置:首页 > 运维架构 > Linux

Linux 文本处理剑客grep

2018-07-29 22:58 197 查看
grep(grep: Global search REgular expression and Print out the line)用作文本搜索工具,旨在根据其Pattern逐行打印匹配到的行。其中pattern为由正则表达式元字符及文本字符所编写的过滤条件。用法相对简单即grep[OPTIONS] PATTERN [FILE]。
应用比如:
一、1.想要匹配文件中含有r..t,方法可以grep -i 'r..t' /文件路径。不难发现其中包含两部分1是选项包括哪些2是pattern. pattern中重要组成部分则为元字符和文本字符共同构成一个正则表达式。
2.例如想要匹配r与t之间只有两位字母或数字,则变pattern为[:alnum:]。
grep -i 'r[:alnum:][:alnum:]t'即可。类似的pattern中字符匹配如
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
如此便实现了r、t中间放置两位不明字符到两位字母或数字类字符的过程。
二、如若有r、t的pattern 出现字符次数需求时,如需要匹配r后任意次的字母的筛选pattern。将如下grep -i 'r [:alnum:] t'.如果只想出现一次则为grep -i 'r [:alnum:] ?t'。诸如此类显示次数的元字符如下:

匹配前面的字符任意次,包括0次
. 任意长度的任意字符
\? 匹配其前面的字符0或1次
+ 匹配其前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次
用于指定前面一类或该个字符出现的次数。以上像?+?由于对shell来讲有特殊意义。所以用反斜线\则表示转义,取其统配字符中的意义而不取之前字符的意义,而是送给grep的解释。
具体次数可以使用{n}表示前面字符出现0-n次;{m,n}则表示m-n次。
三、再次提出需求,需要寻找r在行首的或者t在行位的,则需要进行行首或尾的锚定。则有
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词
例如:grep -i 'crtl r [:alnum:] ?t'
如果此时想进行数据分析统计数据个数则用管道 | wc -l统计出几个字符
四、正则表达式的分组 包括字符串连在一起表示一个的如下

分组:() 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:(root)+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
如: (string1+(string2))
\1 :string1+(string2)
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:|
如:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
而crtl r这个键位还是比较好用的,可以模糊寻找/检索ls之类之前输入过的文件 crtl e 及alt b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vim 系统使用