1,grep用法
grep [ option ] pattern file ....
[ option ]这种写法表示grep选项可以不写,看自己的需求。
pattern是一种模式,简单点就是正则表达式的元字符组成。正则表达式的有种,基本正则表达和扩展正则表达式,这里元字符和bash的通配符所表示的意义是不一样。
2, basic regexp:基本正则表达式元字符,
(1) .:匹配任意单个字符
查找包含user且user后面带一个字符的行
grep ‘user.’ /etc/passwd (模式可以用单引号和双引号,如果模式中要做变量替换时则必须用双引号,不然会出现变量无法替换)
(2) []:指定范围内的任意字符
查找带有数字的行
grep ‘[0-9]’ /etc/inittab
(3) [^ ]:不匹配[]里的字符(指定范围外的任意单个字符):
查找没有小写字母的行
grep ‘[^a-z]’ /etc/inittab
(4)*:匹配其前面的字符任意多次数(包括零)前面的字符,可以是0到无数个
com*查找包含co且m出现0次或0次以上的行
grep ‘com*’ /etc/man.config
(5)x\{m,n\}:x字符至少出现M次,最多出现N(反斜线表示转义,使{失去原来的意义)
查找包含com且m最少出现一次最多出现4次的行
grep ‘com\{1,4\}’ /etc/man.config
(6)x\{m,\}
查找包含com且m最少出现一次的行
grep ‘com\{1,\}’ /etc/man.config
(7)x\{0,n\}
查找包含com且m最少出现0次,最多出现5次的行
grep ‘com\{0,5\}’ /etc/man.config
(8)x\{n\}
查找包含com且m只出现一次的行
grep ‘com\{1\}’ /etc/man.config
(9).*: 任意长度的任意字符(贪婪模式)
查找包含com的行
grep 'com.*' /etc/man.config
(10)?:匹配其前面的字符0次或1次
查找包含co且m出现0或1次
grep 'com\?' /etc/man.config
(11)特殊字符集
[:lower:]小写字母也可写成[a-z]
[:upper:]大写字母也可写成[A-Z]
[:digit:]数字也可写成[0-9]
[:alpha:]包含大小写字母也可写成[a-zA-Z]
[:space:]所有的空白空间也可写成[ ]
[:alnum:]数字与字母也可写[0-9a-zA-Z]
[:punct:]所有的标点符号
上面特殊字符集用的时候有一点要注意如grep ‘[[:digit:]]’/etc/inittab
[:digit:]本身是表示字符集,所以不能省略
锚定符
(1)^:锚定行首
查找行首以#开头的行
grep '^#' /etc/inittab
(2)$: 锚定行尾
查找行尾以数字结尾的行
grep ‘[[:digit:]]$ /etc/inittab
(3)^$:中间没内容,锚定空白行
查找空白行
grep '^$' /etc/inittab
(4)\<: 锚定单词(也可以写成\b)
查找MANPATH且MANPATH前面不包含任何字符的行
grep '\<MANPATH' /etc/man.config
(5)\>:锚定词尾(也可以写\b)
查找MANPATH且MANPATH后面不包含任何字符的行
grep 'MANPATH\>' /etc/man.config
(6)\<string\>:锚定字符串
查找MANPATH这个字符串的行
grep '\<MANPATH\>' /etc/man.config
grep '\bMANPATH\b' /etc/man.config
(7) \(string\)向后引用 \n (n表示可以有多个引用)
查找以数字开头和以同样数字结尾的行
grep '^\([0-9]\).*\1$' /etc/inittab
(8)&:完全引用
3,grep常用选项
-i: 不区分大小写
-v: 对匹配结果取反
-o: 仅显示匹配到的字符串
-q: 安静,不输出匹配到行
,只返回退出状态,返回0表示找到匹配的行。
-A n:n数字,除了列出该行外,后面的n行也列出来
-B n:除了列出该行外,前面的n行也列出
-E:支持扩展正则表达法等同于Egrep
-F:支持扩展正则表达法等同于Fgrep
4,扩展正则表达式,在基本正则表达式的基础上,有一点小的修改
\( \) 写成()
\{ \} 写成{ }
+:次数匹配,匹配其前面的字符至少出现一次,无上限
|: 或者(二取一)
其余的都一样, 基本正则表达式,使用( ) { } . ? |都需要转义,在扩展正则表达中不需要加\
5, grep例子
(1)不要#号开头的行
grep -v '^#' /etc/man.config
(2) 输出不是数字开关的行
grep '^[^0-9]' /etc/man.config
(3)输出行首是1或2
grep '^\(1\|2\)' /etc/inittab
grep -E '^(1|2)' /etc/inittab
(4)查找前面是rc中间接任意字符而后跟/rc
grep '.*\(rc\).*\/\1.*' /etc/inittab
(5)取出当前电脑上的IP
ifconfig |grep -A 1 "^eth" |grep "\<[0-9.]\{1,\} |cut -d: -f2
eth没有加0,考虑主机有可能有存在多块网卡
本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/900838,如需转载请自行联系原作者