每日linux命令学习-grep模式检索

    grep模式检索指令包括grep,egrep,和fgrep,。Linux系统使用正则表达式优化文本检索,所以在此,笔者首先学习了一下正则表达式。

    1. 正则表达式

    正则表达式使用被称为元字符(Meta)的字符组,元字符解析超出字符本身的含义。正则表达式的元字符集如下表所示(预设正则表达式/基础正则表达式+扩展正则表达式):

运算符作用使用范例
^word搜索以word开始的行范例:查找行首为#开头的哪一行,并列出行号
命令:grep -n '^#' regular_express.txt
word$搜索以word结尾的行范例:将行尾为!的那一行打印出来,并列出行号
命令:grep -n '!$' regular_express.txt
.任意一个字符,有且只有一个字符范例:查找的字符串可以使(eve)(eae)(eee)等,即e与e之间一定要有一个字符,不能是(ee)
命令:grep -n 'e.e' regular_express.txt 
\将特殊字符解析为字符原义范例:查找含有单引号'的那一行
命令:grep -n \' regular_express.txt  
*匹配0个以上字符/字符串范例:查找包含有(ess)的行
命令:grep -n 'ess*' regular_express.txt
[...][list]匹配list中任意一个字符范例:查找含有(gl)或(gd)的那一行
命令:grep -n 'g[ld]' regular_express.txt
[c1-c2]匹配在c1-c2范围内的任意一个字符范例:查找包含有数字的行
命令:grep -n '[0-9]' regular_express.txt
[c1-c2c3-c4]匹配在c1-c2或c2-c3范围内的任意一个字符范例:查找包含有数字或字母的行
命令:grep -n '[0-9a-z]' regular_express.txt
[^c1-c2]匹配在c1-c2范围以外的任意一个字符范例:查找的字符串可以是(oog)(ood)但不能是(oot)
命令:grep -n 'oo[^t]' regular_express.txt
word\{n\}连续匹配word字节n次范例:在g与g之间有2到3个的o存在的字符串所在的行
命令:grep -n 'go\{2,3\}' regular_express.txt  
word\{n,\}连续匹配word字节至少n次
word\{n,m\}连续匹配word字节至少一次,但是不能超过m次
\<word包含有词首为word的字符串的行\<linux:包含以linux字符串开始的词的行
word\>包含有词尾为word的字符串的行\>linux:包含以linux字符串结束的词的行
+匹配+字符之前的多个字符范例:检索inux前至少有一个小写字母的行
命令:grep -n '[a-z]+inux' regular_express.txt
?之前无字符或匹配1个字符,与通配符?不同范例:检索包含有lve或love的行
命令:grep -n 'lo?ve' regular_express.txt
word1|word2匹配word1或word2字符范例:检索包含有love或hate的行
命令:grep -n 'love|hate' regular_express.txt
()字符组范例:检索包含有多次匹配ov的行
命令:grep -n '(ov)+' regular_express.txt

    正则表达式使用的正则表达式扩展方括号如下表所示:

字符类代表意义
[:alnum:]代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:]代表任何英文大小字符,即A-Z,a-z
[:lower:]代表小写字符,即a-z
[:upper:]代表大写字符,即A-Z
[:digit:]代表数字,即0-9
[:xdigit:]代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符
[:blank:]代表空格键与tab按键
[:graph:]除了空格与tab按键之外的其它所有按键
[:space:]任何会产生空白的字符,包括空格键,Tab键,CR等
[:cntrl:]代表键盘上面的控制按键,既包括CR,LF,Tab,Del等
[:print:]代表任意可打印字符
[:punct:]代表标点符号,即" ' ? ! ; : # $

    2. grep

    grep指令用于检索与输入文件的已有模式列表匹配的行,之后通过标准输出复制和显示检索的行。在不超出内存上限的范围内,grep的检索范围对输入行没有限制,而且可以匹配1行中所有字符。

    若输入文件的最后一个字节不是换行符,则执行grep,因为grep是使用换行符分隔匹配对象的,所以无法在文本中匹配换行符。

    注意模式中,正则表达式与单引号('')的应用,单引号内的正则表达式可以被shell解析。

    格式:

    grep [选项] [模式] [文件名]

    常用选项:

    -b:显示时在搜索行添加块编号

    -c:不显示匹配行,只显示匹配行数

    -h:查询多个文件时,不显示文件名

    -i:检索时忽略模式中的字母大小写

    -l:查询多文件时只输出包含匹配字符的文件名,显示时每个文件名用newline隔开

    -n:显示匹配行及行号

    -r:在指定目录及其子目录下进行搜索

    -s:不输出错误信息

    -v:显示不包含匹配模式的所有行

    -w:匹配整个模式表达式

    模式中的正则表达式:

    可以使用除+、?、|、()之外的正则表达式,即预设正则表达式。

    示例:

    1. 搜索有the的行,并输出行号

    [fengbingyan@test:~] $ grep -n 'the' fby.txt

    2. 搜索输出没有the的行,并输出行号

    [fengbingyan@test:~] $ grep -nv 'the' fby.txt

    3. 搜索并输出含有test或tast的行

    [fengbingyan@test:~] $ grep 't[ea]st' fby.txt

    4. 搜索文本中的空行,并输出行号

    [fengbingyan@test:~] $ grep -n '^$' fby.txt

    5. 搜索oo前面没有g的字符串所在的行

    [fengbingyan@test:~] $ grep -n '[^g]oo' fby.txt

    6. 搜索不以英文字母开头的行

    [fengbingyan@test:~] $ grep -ni '[^a-z]' fby.txt

    7. 搜索以.结尾的行

    [fengbingyan@test:~] $ grep '\.$' fby.txt

    3. egrep

    添加了正则表达式+、?、|、(),即扩展表达式,相当于命令:grep -E,用法与grep相同。

    4. fgrep

    fgrep命令类似于grep,相当于命令:grep -F,但是不能使用正则表达式,均按照模式的原样信息进行检索,所以一般不太常用。

    [root@localhost grep]#cat fgrep.txt

    [A-Z]                $95

    B                      99

    [root@localhost grep]#fgrep '[A-Z]' fgrep.txt

    [A-Z]                $95

    [root@localhost grep]#fgrep '$9' fgrep.txt

    [A-Z]                $95

 

转载于:https://www.cnblogs.com/yy20141204bb/p/4939895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值