菜鸟学Linux 第013篇笔记 grep及正则表达式



正则表达式:REGular EXEpression, REGEXP

Basic REGEXP: 基本

Extended REGEXP: 扩展



文本查找

grep, egrep, fgrep

grep: Global Research

使用基本正则表达式定义的模式来过滤文本的命令

根据模式搜索文本,并将符合模式的文本行显示出来

pattern: 文本字符和正则表达式的元字符组合而成的匹配条件]


command

grep (grep, egrep, fgrep - print lines matching a pattern)

-i, --ignore-case

--color Surround  the  matching  string  with  the  marker find in

GREP_COLOR environment  variable.

-v, --invert-match

Invert(倒置,反转)  the  sense  of  matching,  to  select non-matching

            lines.

-o, --only-matching

              Show  only  the  part of a matching line that matches PAT-TERN.

-E, --extended-regexp

              Interpret(解释,说明)  PATTERN  as an extended regular expression (see

              below).

-A NUM, --after-context=NUM(number)

              Print  NUM lines of trailing(结尾) context after matching lines.

              Places a line containing -- between contiguous(adj.相邻的)  groups  of

              matches.

-B NUM, --before-context=NUM

              Print NUM lines of leading(头) context before matching  lines.

              Places  a  line containing -- between contiguous groups of

              matches.

-C NUM, --context=NUM

              Print NUM lines of output context(上下).  Places a line contain-

              ing -- between contiguous groups of matches.

 

 

正则表达式:REGular EXEpression, REGEXP

元字符:匹配字符

. 表示匹配任意字符

.* 表示匹配任意字符任意长度

[] 匹配指定范围内的任意字符

[^] 匹配指定范围外的任意字符

字符集 [:digit:], [:lower:], [:upper:], [:punct:], [:space:],

[:alpha:], [:alnum:]

匹配次数(贪婪模式)

* 表示匹配其前面的字符任意次

\? 表示匹配其前面的字符1次或0次

\{m,n\} 表示匹配其前面的字符至少m次,至多n次

位置锚定

^ 锚定行首,此字符后边的模式匹配必须出现在行首

$ 锚定行尾,此字符前边的模式匹配必须出现在行首

^$ 表示空白行

\<或\b 锚定词首,表示其后面的任意字符必须作为单词首部出现

\>或\b 锚定词尾,表示其前面的任意字符必须为单词的尾部出现


分组:

\(\) 表示一个组,组里边的内容被看为整体,并且可以在后用某个字符来引用前边的分组

\1 表示引用前边从左起第1个左括号开始到与之对应的右括号结束匹配的内容

\2 ……

\n 表示引用前边从左起第n个左括号开始到与之对应的右括号结束匹配的内容

e.g.

\(ab\)* 匹配ab在行里可以出现0-n次

ab* 而不加则表示的是

grep '\(l..e\).*\1' test3.txt 

grep '\([0-9]\).*\1' /etc/inittab 

小练习(翻译含义)

grep '[[:digit:]]$' /etc/inittab 

grep '[[:space:]][[:digit:]]$' /etc/inittab 

grep '\broot\b' test2.txt

grep 'root\>' test2.txt

grep '\<root' test2.txt




扩展正则表达式grep -E= egrep

字符匹配:

. 表示匹配任意字符(同正则)

.* 表示匹配任意字符任意长度(同正则)

[] 匹配指定范围内的任意字符(同正则)

[^] 匹配指定范围外的任意字符(同正则)


次数匹配:

* 表示匹配其前面的字符任意次(同正则)

? 表示匹配其前面的字符1次或0次(同正则)

+ 匹配其前面的字符至少一次

{m,n} 同正则表达式只是不需要插入转译字符'\'



位置锚定:

^ 锚定行首,此字符后边的模式匹配必须出现在行首(同正则)

$ 锚定行尾,此字符前边的模式匹配必须出现在行首(同正则)

^$ 表示空白行(同正则)

\<或\b 锚定词首,表示其后面的任意字符必须作为单词首部出现(同正则)

\>或\b 锚定词尾,表示其前面的任意字符必须为单词的尾部出现(同正则)



分组的:含义相同只是不需要转译字符'\'(同正则)

()

\1, \2, \n ..


或者

e.g.

C|cat C或cat

grep -E 'C|cat' test6.txt 匹配 C 或cat 

grep -e '(C|c)at' text6.txt 匹配 Cat 或 cat



练习:

1、找出某文件中的,1位数,或2位数;

2、找出ifconfig命令结果中的1-255之间的整数;

3、查找当前系统上名字为user8(必须出现在行首)用户的账号的相关信息,/etc/passwd;















KEY

1、#grep -E '[[:digit:]]{1,2}' /proc/cupinfo

2、#ifconfig | egrep --color '\<([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-9][0-9])\>'

3、#grep -E '^(user8)' /etc/passwd