shell-grep中的正则表达式

介绍

ls /usr/bin | grep zip

这个命令会列出,位于目录 /usr/bin 中,文件名中包含子字符串“zip”的所有文件。

这个 grep 程序以这样的方式来接受选项和参数:

grep [options] regex [file...]

这里的 regx 是指一个正则表达式。
下面是grep的常见options列表:

-i:模式匹配时忽略大小写
-V:显示不匹配的行
-l:列出匹配模式的文件名称,而不是打印匹配的行
-n:列出检索目标所在的行号
-c:统计匹配的行总数,不显示行信息

grep 正则表达式示例

在 /etc/passswd 目录中搜索 ‘liuyan’:

grep liuyan /etc/passwd

输出:

liuyan:x:1001:1001:,,,:/home/liuyan:/bin/bash

搜索大小写任意的 liuyan 或 raj:

grep -E -i -w 'liuyan|raj'/etc/passwd

这里加上-E,就是一个扩展的正则表达式的模式。

锚点

你可以分别使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾。

grep ^liuyan /etc/passwd

仅仅只搜索出以单词 liuyan 开始的行,即不显示 liuyangit、liuyang 等:

grep -w ^liuyan /etc/passwd
grep 'foo$' 文件名        #找出以单词foo结尾的行
grep '^foo$' 文件名       #匹配仅仅只包含foo的行
grep '^$' 文件名          #搜索空行

字符类

grep '[lL]iuyan' 文件名
grep -w '[lL]iuyan[0-9]' 文件名
grep 'foo[0-9][0-9]' 文件名
grep '[A-Za-z]' 文件名
grep [wn] 文件名

放在括号内的表达式,即包在 “[[:” 和 “:]]” 之间的字符类的名字,它表示的是属于此类的所有字符列表。标准的字符类名称如下:

[[:alnum:]] - 字母数字字符
[[:alpha:]] - 字母字符
[[:blank:]] - 空字符: 空格键符 和 制表符
[[:digit:]] - 数字: '0 1 2 3 4 5 6 7 8 9'
[[:lower:]] - 小写字母: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
[[:space:]] - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符
[[:upper:]] - 大写字母: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
grep '[[:upper:]]' 文件名  #匹配所有大写字母

通配符

你可以使用 “.” 来匹配单个字符。

grep '\<b.t\>' 文件名  #匹配以 "b" 开头以 "t" 结尾的3个字符的单词
grep '^..$' 文件名        #匹配只有两个字符的所有行
grep '^\.[0-9]' 文件名 #匹配以一个点和一个数字开头的行
\< 匹配单词前面的空字符串
\> 匹配单词后面的空字符串
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' 文件名  #匹配通用的IP地址
grep -e '--test--'文件名           #搜索以“-” 符号开头的匹配模式,如果不用-e选项grep 命令会试图把 '--test--' 当作自己的选项参数来解析
grep -E 'word1|word2'文件名        #使用 grep 的“或”匹配
grep 'word1' 文件名 | grep 'word2' #使用 grep 的“和”匹配

序列检测

egrep "v{2}" 文件名        #匹配字符 “v" 出现两次
egrep 'co{1,2}l' 文件名    #匹配 "col" 和 "cool"
egrep 'c{3,}'文件名        #匹配至少有三个 'c' 字符的所有行
grep "[[:digit:]]\{2\}[-]\?[[:digit:]]\{10\}" 文件名   #匹配 91-1234567890(二个数字-十个数字) 这种格式

总结

字符限定符

.           匹配任意的一个字符
-[]中表示字符范围
[]          代表一定有一个在括号内的字符(非任意字符)
[^]         若括号内的第一个字符为指数字符(^),那表示反向选择

数量限定符

?       匹配前面的子表达式,0-1次。
*       匹配前面的子表达式,0-N次。
+       匹配前面的子表达式,1-N次。
{N}     匹配前面的子表达式 N 次。
{N,}    匹配前面的子表达式 N 次到多次。
{N,M}   匹配前面的子表达式 N 到 M 次。

位置限定符

^       匹配行首位置。
$       匹配行尾位置。
\b      匹配一个单词前后的空字符串。
\B      匹配一个单词中间的空字符串。
\<      匹配单词前面的空字符串。
\>      匹配单词后面的空字符串。
egrep -c '[[:punct:]]{2,}' -r ./raw_data    #查找超过两个标点在一起的行数
egrep -c '\.{2,}' -r ./raw_data             #查找超过两个.在一起,有多少行
grep -o 'n.t' nohup.out |wc -l              #个数
grep -o ‘objStr1\|objStr2'  filename|wc -l  #直接用\| 链接起来即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值