首页 > 代码库 > Linux 三剑客之一-->grep
Linux 三剑客之一-->grep
========================================================================================
* ######------ Linux 正则表达式 ------######
* ######------ 三剑客 grep 文本过滤 ------######
*/
========================================================================================
******Linux-通配符
# 作用:通配符主要应用匹配文件名上,而正则主要应用于字符串上
常有通配符* ? ^ [] {} 等等
符号 作用
* 表示匹配任意字符
? 表示匹配任意一个字符
^ 表示取反操作
[a-z] 表示匹配a-z任意一个字母
{} 表示一组表达式的组合
========================================================================================
Linux-特殊符号
\a alert BEL
\b 退格键( Back Space)
\f FormFeed 换页仅影响打印机
\n Newline, 回车换行
\r return, 回车回行首
\t Tab(水平 4,8 格)
\v Vertical Tab 仅影响打印机
\o 空字符(NULL)
\xNN 转换 NN 数字成为字符
\d dd 八进制值
\c 取消行末之换行符号
\E ESCAPE,跳脱键
\‘ 在双引号里只用单引号即可
\" 双引号
\\ 反斜杠 \? 问号字符
========================================================================================
#什么是正则表达式#
1:正则表达式就是为了处理大量的字符串而定义的一套规则和方法
2:通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换和输出需要的字符串,Linux正则表达式一般以行为单位处理
简单说:
处理大量字符串而定义的一套规则和方法
linux正则一般以行为单位处理
#经常使用正则表达式的shell命令和工具:Linux三剑客(grep、sed、awk)
#grep、vi、sed都属于BRE(基本正则表达式)这一派,我保证兼容EBR,可以使用\进行转移特殊符号
#egrep、awk则属于ERE(扩展正则表达式)这一排
**grep支持: BREs、EREs、PREs **egrep支持:BREs、EREs
grep 不使用参数-E表示使用"BREs" egrep 不使用参数表示使用"EREs"
grep -E 表示使用"EREs" egrep -P 表示使用"PREs"
grep -P 表示使用"PREs"
grep -G 表示使用"BREs"
grep -F 表示使用无正则表达式元字符集
**sed正则特点(按行处理),默认BRE,可以使用sed -r开启扩展正则表达式(ERE)
**awk(gawk)正则特点(对列进行操作),默认扩展正则表达式(EREs)
#******基本正则表达式 (BRE Basic Regular Expression)
^word 匹配开头,搜寻以word开头的行(例如:搜寻以#开头的脚本注释行. grep ‘^#’ cdly.txt)
word$ 匹配结尾,搜寻以word结束的行(例如:搜寻以‘.’结束的行. grep ‘.$’ cdly.txt)
^$ 表示匹配空行
* 表示重复前一个字符0此或多次(例如:匹配gle,gogle,google,gooogle等等. grep –n ‘go*gle’ cdly.txt)
. 表示匹配任意一个字符 "cd.y"满足的列子 cdly cdqy cdmy
.* 表示匹配任意字符(例如:gle,gogle,google,gooogle等等. grep –n ‘g.*gle’ cdly.txt)
[a-z] 表示匹配字符集合(例如:匹配gl,gf. grep ‘g[lf]’ cdly.txt)
[0-9] 表示匹配一个字符范围中的一个字符 (例如:匹配数字字符. grep ‘[0-9]’ cdly.txt)
[^a-z] 表示匹配除了a-z之外的其他字符(例如:匹配非c字符 ‘g [^c]’ cdly.txt)
\ 转义符,屏蔽一个字符的特殊意义(例如:搜寻’*’是一个特殊字符,在正则表达式中有特殊含义,必须要先转义. grep ‘\*’ cdly.txt)
\b 匹配单词的起始位置,在awk中使用\b表示后退字符,因为awk(gawk)使用\y表示此功能
\B 匹配单词的结束位置
\d 匹配0-9中的任意一个数字,等同于[0-9]
\D 匹配非数字,等同于[^0-9]
\w 匹配任何单词组成的字符,等同于[[:alnum:]_]或[a-zA-Z0-9]
\W 匹配任何非单词组成的字符,等价于[^[:alnum:]_]或[^a-zA-Z0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
\S 匹配人恶化非空白字符,等价于[^\f\n\r\t\v]
\t 匹配一个横向制表符,等价于\x09或\cI
\v 匹配一个垂直制表符,等价于\x0b或\cK
\n 匹配一个换行符,等价于\x0a或\cJ
\f 匹配一个换页符,等价于\x0c或\cL
\r 匹配一个回车符,等价于\x0d或\cM
\\ 匹配转义字符本身\
\cx 匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M或回车符,x的值必须为A-Z或a-z之一,否则,将c视为一个原义的‘c‘字符
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:‘\x41‘ 匹配 "A"。 ‘\x041‘ 则等价于‘\x04‘ & "1"。 正则中可使用 ASCII编码
\num匹配num,其中num是一个正整数。表示对所获取的匹配的引用
\‘ 匹配emacs缓冲区的开始,类似^
\` 匹配emacs缓冲区的结束,类似$
\< 表示匹配单词开始(例如:匹配以g开头的单词. grep ‘\<g’ cdly.txt)
\> 表示匹配单词结束(例如:匹配以g结尾的单词. grep ‘g\>’ cdly.txt)
\<\>表示匹配单词的起始位置和结束位置,等价于匹配一个单词
\{n,m\} 表示匹配前面的字符最少出现n次,最多出现m次(例如:匹配google,gooogle. grep ‘go\{2,3\}gle’ cdly.txt)
\{n\} 表示匹配前面的字符出现n次
\{n,\} 表示匹配前面的字符最少出现n次(例如:匹配最少出现2次的o grep ‘go\{2,\}gle‘ cdly.txt)
\{,m\} 表示匹配前面的字符最多出现m次,该方式有的版本不支持,可以使用\{0,m\}
#******扩展正则表达式 (ERE Extend Regular Expression)
? 表示匹配前面的字符出现0次或1次(例如,匹配gd,god. grep –E ‘go?d’ cdly.txt或grep ‘go\?d‘ cdly.txt)
+ 表示匹配前面的字符出现1次或多次(例如:匹配god,good,goood等等字符串. grep –E ‘go+d‘ cdly.txt或grep ‘go\+d‘ cdly.txt)
() 表示匹配整个括号内的字符串,原来都是匹配单个字符 (例如:搜寻good或者glad. grep -E ‘g(oo|la)’ cdly.txt)
| 表示"或",匹配一组可选字符(例如:匹配god或者good. grep -E ‘god|good’ cdly.txt或grep ‘god\|good‘ cdly.txt
#posix字符类(使用与BRE、ERE、PRE)使用是必须使用双括号[[:alnum:]]
#特殊符号 代表意义
[:alnum:] 代表英文字母大小写及数字,比如:[a-zA-Z0-9]
[:alpha:] 代表任何英文大小写,比如:[a-zA-Z]
[:lower:] 代表小写字母,比如:[a-z]
[:upper:] 代表大写英文字母,比如:[A-Z]
[:digit:] 代表数字,比如:[0-9]
[:blank:] 代表空白按键或[Tab] 按键
[:cntrl:] 代表键盘上面的控制按键,比如:CR, LF, Tab, Del.. 等等
[:graph:] 除了 (空白按键 [Tab] 按键) 外的其他所有按键
[:print:] 代表任何可以被打印的字符
[:punct:] 代表特殊符号,比如:分号\" 单引号\‘ ? ! ; : # $...
[:space:] 任何任何空白键,包括空白键, [Tab], CR 等等
[:xdigit:] 代表 16 进制的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符
========================================================================================
**grep命令
#功能:输入文件的每一行中查找字符串,搜索字符串请以单引号括起来
#作用:全面搜索正则表达式并把找到的行打印出来
#基本用法:grep [-acinv] [--color=auto] [-A n] [-B n] ‘搜寻字符串‘ 文件名
#参数说明:
-a: 将二进制文档以文本方式处理(或--binary-files=text)
-b: 显示匹配的内容总共有多少byte
-c: 显示匹配次数
-i: 忽略大小写
-n: 在行首显示行号
-o: 只显示匹配的内容
-E: 采用规则表达式去解释样式
-f: 将grep表达式写入一个文件,然后使用-f引用
-A num:After的意思,显示匹配字符串后num行的数据
-B num:before的意思,显示匹配字符串前num行的数据
-C num:显示匹配字符串前后各num行的数据
-v: 反向查找,匹配的内容不显示,只显示不匹配的内容
-l 输出匹配的文件名
-L 输出不匹配的文件名
-h 抑制文件名的输出
-q 只返回匹配的状态,只能使echo $? 0表示找到匹配的行,非0表示无找到匹配的行
-r 递归查询,到子目录中搜索
-w 执行单词搜索,完全符合该单词的行才会被列出,相当于\<\>
--color:以特定颜色高亮显示匹配关键字 (alias grep=‘grep --color=auto’)(最好在.bashrc或者.bash_profile文件中加入)
方便grep测试,可以将以下命令进行命名别名:核查出来的结果会以红色字体显示
[root@ /cdly/tmp]# cat >> ~/.bashrc <<EOF
alias egrep=‘egrep --color=auto‘
alias grep=‘grep --color=auto‘
EOF
[root@ /cdly/tmp]# zcat aa.tar.gz |grep --binary-files=text ‘11‘ #从压缩包中的文件过滤所需内容
[root@ /cdly/tmp]# zcat aa.tar.gz |grep -a ‘11‘ #从压缩包中的文件过滤所需内容
[root@ /cdly/tmp]# grep -c ‘^$‘ file #统计空格数
[root@ /cdly/tmp]# grep -c ‘^ *$‘ file #匹配空行
[root@ /cdly/tmp]# grep NW file #打印所有包含正则表达式 NW 的行。
[root@ /cdly/tmp]# grep NW d* #打印所有以d开头的文件中且包含正则表达式NW的行
[root@ /cdly/tmp]# grep ‘^n‘ file #打印所有以n开头的行。 ^表示锚定行的开头。
[root@ /cdly/tmp]# grep ‘4$‘ file #打印所有以4结束的行。 $表示锚定行的结尾。
[root@ /cdly/tmp]# grep TB Savage file #在文件Savage和file查找包含TB的行
[root@ /cdly/tmp]# grep ‘TB Savage‘ file #打印所有包含TB Savage 的行。
[root@ /cdly/tmp]# grep ‘5\..‘ file #第一个是5,紧跟着一个点,再后是任意一个字符
[root@ /cdly/tmp]# grep ‘\.5‘ file #打印所有包含字符串“.5”的行。
[root@ /cdly/tmp]# grep ‘^[we]‘ file #打印所有以w或者e开头的行。
[root@ /cdly/tmp]# grep ‘[^0-9] ‘ file #括号内的^表示任意一个不在括号范围内的字符。
[root@ /cdly/tmp]# grep ‘[A-Z][A-Z] [A-Z]‘ file #打印所有包含前两个字符是大写字母,后面紧跟着一个空格及一个大写字母的字符串的行。例如,TB Savage 和AM Main。
[root@ /cdly/tmp]# grep ‘ss* ‘ file #打印所有包含一个或者多个 s 且后面跟有一个空格的字符串的行。比如,Charles 和 Dalsass
[root@ /cdly/tmp]# grep ‘[a-z]\{9\}‘ file #打印所有包含每个字符串至少有9个连续小写字符串的行
[root@ /cdly/tmp]# grep ‘\(3\)\.[0-9].*\1 *\1‘ file #第一个字符是3,紧跟着一个句点,然后是任意一个数字,然后是任意个数字,然后是一个 3,然后是任意个制表符,然后又是一个3。因为3在一对圆括号中,它可以被后面的\1 引用
#匹配类型:3.2cdly3 3或3.5aaa3 3
[root@ /cdly/tmp]# grep ‘\<north‘ file #所有包含以north开始的单词的行
[root@ /cdly/tmp]# grep ‘\bnorth\b‘ file #所有包含以north开始的单词的行
[root@ /cdly/tmp]# grep ‘^n\w*\W‘ file #第一个字符是n,紧跟着是任意个字母或者数字字符,然后是一个非字母数字字符,\w 和\W 都是标准的单词匹配符
[root@ /cdly/tmp]# grep ‘\<[a-z].*n\>‘ file #第一个字符是一个小写字母,紧跟着是任意个字符,然后以字符 n 结束。注意.*,它表示任意字符,包括空格
[root@ /cdly/tmp]# ls –l|grep ‘^[^d]‘ #不匹配开头是d的目录,表示去掉所有目录
实例:文件内容如下
[root@ /cdly/tmp]# seq -w 10 > file;cat file
01
02
03
04
05
06
07
08
09
10
[root@ /cdly/tmp]# grep -A 2 ‘03‘ file #-A 2显示匹配的行,并且将匹配的下两行也显示出来
3:03
4-04
5-05
[root@ /cdly/tmp]# grep -B 2 ‘03‘ file #-B 2显示匹配的行,并且将匹配的上两行也显示出来
1-01
2-02
3:03
[root@ /cdly/tmp]# grep -C 2 ‘03‘ file #-C 2显示匹配的行,并且将匹配的前后两行也显示出来
1-01
2-02
3:03
4-04
5-05
[root@ /cdly/grep]# echo 1111 > a1.txt
[root@ /cdly/grep]# echo -e "aaa\n222" > a2.txt
[root@ /cdly/grep]# grep -L ‘^[a-z]‘ * #-L 显示没有符合的文件名称
a1.txt
[root@ /cdly/grep]# grep -l ‘^[a-z]‘ * #-l 显示匹配内容的文件名称
a2.txt
[root@ /cdly/grep]# grep -q ‘08‘ file;echo $? #核查到匹配的结果,故返回状态0
0
[root@ /cdly/grep]# grep -q ‘088‘ file;echo $? #未核查到匹配的结果,故返回状态非0
1
Linux 三剑客之一-->grep