grep
正则表达式:
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
常用选项:
--color=auto:对匹配到的文本着色高亮显示;
-i:忽略字符大小写;
-o:仅显示匹配到的文本自身;(默认显示匹配到的文本整行)
-v,--invert-match:反向匹配;
-E,--extened-regexp:支持扩展的正则表达式;相当于egrep命令,对grep和fgrep有用;
-F,--fixed-strings:相当于fgrep命令;
-q,--quiet,--silent:静默模式,不输出任何信息;取命令执行状态码时常用;
-G,--basic-regexp:支持使用基本正则表达式,对egrep和fgrep有用;
-P,--perl-regexp:支持使用pcre正则表达式(支持元字符很多,非常强大);
-e PATTERN,--regexp=PATTERN:使用多模式;
-f FILE,--file=:FILE为每行包含了一个pattern的文本文件,即grep script;把模式写在一个文件里,通过读取文件(脚本文件),来匹配;
-c:显示统计匹配到的行数;
-r,--recursive:对目录下所有文件里的内容根据模式匹配;
-A #,--after-context=#:表示显示匹配到行的后面#行;
-B #,--before-context=#:表示显示匹配到行的前面#行;
-C #,-#,--context=#:表示显示匹配到行的前后#行;
例如:
# grep 'root' /etc/passwd:如果模式里有变量要用双引号;
# grep -v 'root' /etc/passwd:反向匹配;
# grep -i 'root' /etc/passwd:忽略字符大小写;
# grep -o 'root' /etc/passwd:仅显示匹配到的文本自身;
# grep -q 'root' /etc/passwd:静默模式;
# echo $?;取命令执行状态码时常用;
元字符分类:字符匹配、匹配次数、位置锚定、分组
基本正则表达式元字符
字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
例如:
# ifconfig | grep "r..":r后跟两个字符的行;
# ifconfig | grep -i "i[a-z][a-z]":不区分大小写,i后跟两个字母的行;
# ifconfig | grep "i[[:alpha:]][[:space:]]":i后跟一个字母再跟一个空格的行;
次数匹配:
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
例如:
# ifconfig | grep "i[[:alpha:]]\{3\}":匹配i后跟3个字母的行;
# ifconfig | grep "i[[:alpha:]]\{3,\}":匹配i后跟至少3个字母的行;
位置锚定:
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
例如:
# grep "^r..t" /etc/passwd:匹配r开头后跟两个字符再跟t的行;
# grep "l.\{3\}n" /etc/passwd:匹配l后跟3个字符再跟n的行;
# grep "l.\{3\}n$" /etc/passwd:匹配l后跟3个字符再跟n结尾的行;
# grep "^l.\{3\}n$" /etc/passwd:匹配只能是l开头后跟3个字符再跟n结尾的行;
# grep "[[:space:]]\+" /etc/passwd:匹配至少连续出现一个空格的行;
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\
例如:
# grep "\ # grep "\ # ifconfig | grep "\<[0-9]\{3\}\>":匹配单词:三个数字;
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体处理 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身 或者:\| 1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法) grep -i "^s" /proc/meminfo grep "^[sS]" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行 grep -v "/bin/bash$" /etc/passwd 3、显示用户rpc默认的shell程序 grep "\ 4、找出/etc/passwd中的两位或三位数 grep -o "\<[[:digit:]]\{2,3\}\>" /etc/passwd 5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行 grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行 netstat -tan|grep "LISTEN[[:space:]]\+" 7、显示CentOS7上所有系统用户的用户名和UID grep -E "\<[[:digit:]]{0,3}\>" /etc/passwd |cut -d: -f1,3 8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行 添加用户 cat /etc/passwd |grep -E "^([[:alnum:]]*\>).*/\1$" 9、利用df和grep,取出磁盘各分区利用率,并从大到小排序 grep "^/dev/sd.." df.txt |tr -s " " |cut -d" " -f1,5|sort -n