首页 > 代码库 > linux初学之——正则表达式及grep系
linux初学之——正则表达式及grep系
grep sed awk 被称为文本处理三剑客,本篇主要讲下grep。
grep: Global search Regular Expression and Print out the line
利用正则表达式进行全局搜索并将匹配的行显示出来;
想要对grep进行深入了解就要先对正则表达式进行初步认知和学习,接下来,我们先介绍下正则表达式。
正则表达式
正则表达式:是一类字符所书写出的模式(pattern);元字符:不表示字符本身的意义,用于额外功能性的描述。
正则表达式元字符:
基本的正则表达式 BRE
GLOBBING------简化版的正则表达式:[] ? *
字符匹配:
. :匹配任意单个字符
[]:匹配指定范围内的任意单个字符
^: 匹配指定范围以外的任意单个字符
所有字符集都可以放置[]之中用于匹配单个字符
[:lower:]: 所有小写字母
[:upper:]: 所有大写字母
[:alpha:]: 所有字母
[:digit:]: 所有十进制数字
[:space:]: 空白字符
[:alnum:]: 字母或数字
[:punct:]: 所有标点符号
[:xdigit:]:所有16进制数字
a-z:所有小写字母
0-9:所有10进制数字
次数匹配: 该类字符之前的那个字符可以出现的次数
*:其前面的字符可以出现任意次(0,1,多次)
\?:其前面的字符可有可无(0/1次)
\+:其前面的字符至少出现一次(一次或多次)
\{num\}:其前面的字符必须出现m次
\{m,n\}:其前面的字符至少出现m次至多出现n次;
\{,n\}:其前面的字符至少出现0次至多出现n次;
\{m,\}:其前面的字符至少出现m次,多多益善;
在正则表达式中表示任意长度任意字符的方式: .*
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\< \b
字尾锚定: \> \b
\b :旧版本中的锚定方法,建议不用
对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;
分组与引用字符:
\(PATTERN\) :将此PATTERN所匹配到的所有字符当做一个不可分割的整体来处理
在正则表达式引擎当中有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后向引用;这些变量依次是:\1 , \2 \3 ....
pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
\1:第一组小括号中pattrn匹配到的字符即pattern2
\2:第二组小括号中pattrn匹配到的字符即pattern4
\3:第三组小括号中pattrn匹配到的字符即pattern5
或:
\|
注意:\| 将其左右两边的字符串当做整体对待
扩展正则表达式 ERE
与基本正则不相同的部分:
+: 匹配其前面的字符至少 1 次
?: 匹配其前面的字符 1 次或 0 次
{m,n}: 匹配其前面的字符至少 m 次,至多 n 次
(): 分组
a|b: a 或者 b
在对正则表达式进行初步了解后在继续学习 grep
grep [OPTIONS] PATTERN [FILE...]
PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成;
正则表达式的元字符:会被正则表达式的引擎解释为特殊含义;
pcre-perl:语言的正则表达式引擎
基本额正则表达式:BRE
扩展的正则表达式:ERE
grep默认情况下仅支持基本正则表达式
egrep默认仅支持扩展正则表达式
fgrep默认不开启表达式引擎
文本字符:只具备字符表面含义的那些字符
常用选项:
-i, --ingore-case:忽略文本字符的大小写
-v, --invert-match:反向匹配;最终显示的结果是PATTERN不能成功匹配的行
-c, --count:计数,统计匹配PATTERN的所有行数
-o ,--only-mathing:关闭贪婪模式,仅显示PATTERN能匹配的内容
-q,--quiet,--silent:安静模式,不输出任何匹配结果
--color [=WHEN], --colour[=WHEN] :将匹配PATTERN的内容以高亮形式显示 --color=auto
-E:扩展的正则表达式,grep -E相当于 egrep
-F: grep -F相当于fgrep,
-G:基本的正则表达式,egrep -G相当于grep
-P;使用PCRE(Perl Common Regular Expression)引擎
-A NUM, --after-context=NUM :显示匹配PATTERN行的同时显示其后面的NUM行
-B NUM, --before-context=NUM :显示匹配PATTERN行的同时显示其前面的NUM行
-C NUM, -NUM, --context=NUM :显示匹配PATTERN行的同时显示其前后的NUM行
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默认情况下,grep命令后面只允许有一个pattern,如果想要在一次grep搜索过程中写多个pattern需要使用-e选项,每个-e选项只能使用一个pattern作为参数;
将需要的PATTERN写入到一个文件中, 保证每行只有一个PATTERN;使用-f FILE方式来实现多PATTRN作为参数;
其他的文本处理命令:
wc:
wc[OPTION]...[FILE]
-l: 只显示行数
-w: 只显示字数
-c: 只显示字符数
cut: remove sections from each line of files
能够被cut修剪的文件,一般都是具有一定结构或格式的文本文档;
cut OPTION... [FILE]...
-d, --delimiter=DELIM:指定在实施修剪操作时所依赖的分隔符,默认是空白符
-f,--fields=LIST:根据定义的分隔符来指定字段的编号
地址定界使用方法:
#:选择被指定的单个字段
#,#:离散的多个被指定的单个字段
#-#:连续的多个被指定的字段
--output-delimiter=STRING:指定输出分隔符
grep练习题:
1) 显示/etc/passwd文件中不以bash结尾的行;
# grep -v ‘bash$‘
2)显示/etc/passwd文件中其默认的shell为非/sbin/nologin的用户
# grep -v ‘/sbin/nologin$‘ /etc/passwd
3) 找出/etc/grub2.cfg(在CentOS6中是/etc/grub.conf)文件中,以空白字符开头的非空白行;
# grep --color=auto ‘^[[:space:]]\+[^[:space:]]‘ /etc/grub2.cfg
4)显示当前系统上rootx或bash
用户的默认shell;
# grep -E ‘^(root|bash):‘ /etc/passwd | cut -d: -f7
5)
找出
/etc/rc
.d
/init
.d
/functions
文件中某单词后跟一组小括号“()”行;
# grep -E -o ‘\<[[:alnum:]]+\>\(\)‘ /etc/rc.d/init.d/functions
6) 找出"ldd /usr/bin/vim"命令的结果中所有的文件路径;
# ldd /usr/bin/vim | cut -d‘ ‘ -f3
7) 找出/proc/meminfo文件中,所有以大写S或小写s开头的行,你有多少种方法实现该任务?
# cat /proc/meminfo | grep ‘^[sS]‘
# cat /proc/meminfo | grep ‘^[s|S]‘
# cat /proc/meminfo | grep -i ‘^s‘
linux初学之——正则表达式及grep系