3.1.1、Grep常用选项:
PS:为了能更好的学习每一个知识,我在每一个知识点后面都有加一个例子,自己多多动手,多多练习,这样效果才会更好。
一、grep起源
grep原先是ed下的一个应用程序,其名称来自于g/re/p(globally search a regular expression and print,以正规表示法进行全域查找以及打印),在ed下,输入g/re/p这个命令后,会将所有符合原先定义的字符串,以行为单位打印出来
二、grep用处
grep是用来搜索文本或者搜索某些文件里面的行,这些行里面包括和给定的字符串或者单词相匹配的字符串或者单词。默认情况下,grep显示出匹配到的行。用grep搜索文本,找到里面匹配一个或者多个正则表达式的行,并且输出这些行。Grep被认为是UNIX和其他类UNIX操作系统中最有用的命令之一。
三、Grep使用
grep [OPTIONS] PATTERN[FILE...]
在 grep[OPTIONS] PATTERN [FILE...] 中的PATTERN可以是一个字符长也可以是一个正则表达式
3.1、PATTERN是一个字符串:
3.1.1、Grep常用选项:
--color:
搜索到的"hi"字符串,显示为红色,auto表示自动的
grep --color=auto ‘hi‘ b.txt hi jerry
-v:反向选取,以下面为例,就是不包含"hi"字符串
# cat b.txt hello world hi jerry my name is linux. [[email protected] bash]# grep -v ‘hi‘ b.txt hello world my name is linux.
-o:仅显示匹配到的内容
[[email protected] bash]# grep ‘hi‘ b.txt hi jerry [[email protected] bash]# grep -o ‘hi‘ b.txt hi
-i:忽略字符大小写,以下面为例,加上-i之后,能匹配到"My"了
[[email protected] bash]# cat b.txt hello world hi jerry my name is linux. Hello world My name is linux. [[email protected] bash]# grep ‘my‘ b.txt my name is linux. [[email protected] bash]# grep -i ‘my‘ b.txt my name is linux. My name is linux.
-A #:把匹配到的行的后#行也打印出来,以下面为例,把匹配到的那一行的后两行也打印出来;
[[email protected] bash]# cat b.txt hello world hi jerry my name is linux. Hello world what is your name? Learn linux is fun. Do you think so? [[email protected] bash]# grep -A 2 ‘what‘ b.txt what is your name? Learn linux is fun. Do you think so?
-B #:把匹配到的行的前#行业打印出来,以下面为例,把匹配到的那一行的前两行也打印出来;
[[email protected] bash]# cat b.txt hello world hi jerry my name is linux. Hello world what is your name? Learn linux is fun. Do you think so? [[email protected] bash]# grep -B 2 ‘what‘ b.txt my name is linux. Hello world what is your name?
-C #:把匹配到的行的前#行和后#行也打印出来,如下所示,把匹配到那行的前后两行都打印出来;
[[email protected] bash]# cat b.txt hello world hi jerry my name is linux. Hello world what is your name? Learn linux is fun. Do you think so? [[email protected] bash]# grep -C 2 ‘what‘ b.txt my name is linux. Hello world what is your name? Learn linux is fun. Do you think so?
3.2、PATTERN是一个正则表达式:
尽管直接使用最简单直接的pattern字串可以完成一些重要的任务,但是grep命令的真正的威力在于它可以使用正则表达式来完成复杂的模式字串的匹配。
3.2.1 什么是正则表达式?
正则表达式:
正则表达式又称正规表达式、正规表示法、正规表示式、规则表达式、常规表达式(英文:Regular Expression—>这里正好和grep的英文名对应,grep就是搜索正规表达式并且打印输出),在代码中常常简写为regex,regexp或RE,计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由UNIX中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成”regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
正则表达式历史:
最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。 1940年,WarrenMcCulloch与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。 1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。自此,正则表达式被广泛地使用于各种Unix或者类似Unix的工具,例如Perl。
正则表达式两类
在grep的PATTERN中分两类正则表达式:
基本正则表达式:
扩展正则表达式
Grep命令中使用的是基本的正则表达式,如果想使用更高级也就是扩展正则表达式需要指定选项-E,相当于egrep命令。
基本正则表达式:
包括四种类型的模式匹配规则
字符匹配:
.:点号是用来匹配任意单个字符
如下所示,"t...k"是匹配"t"和"k"之间有3个字符的字符串
[[email protected] bash]# cat b.txt hello world hi jerry my name is linux. Hello world what is your name? Learn linux is fun. Do you think so? [[email protected] bash]# grep ‘t...k‘ b.txt Do you think so?
[]:匹配指定集合中的任意单个字符
[[:digit:]] 或者 [0-9]
[[:lower:]] ---à[a-z]
[[:upper:]] --à[A-Z]
[[:alpha:]] -à[a-zA-Z]
[[:alnum:]] -à[0-9a-zA-Z]
[[:space:]] -à
[[:punct:]]
[^]:匹配指定集合外的任意单个字符
匹配次数:
对其前面紧邻字符所能出现的次数做出限定
*:匹配其前面的字符任意次,0次1次多次都行;
\?: 匹配其前面的字符0次或者1次,也就是说没有可以,有的话只能出现一次;
\+: 匹配其前面的字符至少一次;
\{m\}: 匹配其前面的字符m次;
\{m,n\}: 匹配其前面的字符至少m次,最多n次;
\{m,\}: 匹配其前面的字符至少m次,多余m次无限制;
.*: 匹配任意长度的字符
位置锚定:
^: 锚定行首
$: 锚定行尾
^$: 锚定空白行
\<或者\b: 锚定词首
\>或者\b: 锚定词尾
\<\>:锚定单词
\(\):分组
后向引用:
如果在模式中使用\(\)实现了分组,在文本检查中,如果\(\)模式匹配到了某个内容,此内容后面的模式可以被引用;用\1引用第一个\(里面的内容,用\2应用第二个\(里面的内容,一次类推\3、\4 …….