在Linux中,有条基本哲学“使用文本文件来保存配置信息”。这就意味着在日常操作中需要大量的针对文本文件进行操作。在学习过程中我 们用来练习或者作为范例的文本文件通常比较短小,但在实际工作中可能情况就会大不相同,所以如何在熬长的内容中尽快找到我们想要的数据就是一个很重要的工 作。而grep就是来解决这个问题的。
gerp是一个文本处理工具,也可以说是一个文本搜索工具。其可以根据我们的想法来设定相应的搜索方式来帮助我们来迅速查找到想要解数据。
用法:
grep [OPTIONS] PATTERN [FILE...]
grep 选项 模式 文件...
常用的options:
--color=auto:这个选项是将模式查找到的内容以带颜色的方式显示出来,方便我们查看;
例
# egrep --color "bash" /etc/passwd
显示出/etc/passwd文件中包含bash的行;
-v:反向查找,有时我们会遇到查找相反结果的情况;
例:
# grep --color -v "bash" /etc/passwd
显示出/etc/passwd文件中不包含bash的行;
-o:用来显示模式匹配内容的本身,而不是显示一行;
例:
# grep --color -o "bash" /etc/passwd
bash
-i:不区分大小写字符,来匹配模式;
几个特殊options:
-A #(代表数字):显示匹配行的同时,显示其后#行的内容;
-B #:显示匹配行同时,显示其前#行的内容;
-C #:同时显示前#行和后#行的内容;
-E:使用扩展的正则表达式,即egrep;
通常直接使用egrep [OPTIONS] PATTERN [FILE...]这种用法来使用,扩展的正则表达式;
模式:我们用来查找相应内容的匹配方法;也就是模式构建的基本方法――正则表达式;
正则表达式:是一种字符书写的方式;其用来查找匹配字符所代表意义的内容;而其中用来进行这种书写的字符,称为“元字符”。
元字符:不表示字符本身的意义,而是用来进行额外功能的描述;在模式当中一旦包含元字符,一定要使用“”或‘’将元字符选中;如果其中出现变量,并希望进行变量替换则一定要用“”;推荐无论什么时候都使用“”;
正则表达式中有字符匹配,次数匹配,位置锚定,分组,引用这几类;
字符匹配:
.:代表匹配任意单个字符;
[]:代表匹配范围内的任意单个字符;
可以合并使用例如:[0-9a-zA-Z]
[[:upper:]]:大写字符;
ls -d a[[:upper:]]b:表示只显示a,b之间有大写字符;
[[:lower:]]:小写字符;
[[:alpha:]]:无论大小写;
[[:digit:]]:所有数字;
[[:alnum:]]:所有字母和数字;
[[:space:]]:空白字符;
[[:punct:]]:标点符号;
[^]:代表范围外的任意单个字符;
次数匹配:
*:代表匹配前一个字符任意次;
.*:代表任意字符任意次匹配;
\:是一个转义字符,即后面的字符不代表原本的意义,将其后字符意义进行转换;
\?:代表匹配前一个字符0或1次,即可有可无的意思;
\{m\}:代表匹配前一个字符m次;
\{m,n\}:代表匹配前一个字符最少m次,最多n次;
\{m,\}:代表匹配前一个字符至少m次;
\{0,n\}:代表匹配前一个字符至多n次;
位置锚定:
行锚定:
^:锚定行首;
$:锚定行尾;
^$:锚定空白行;
词锚定:
\<:锚定词首;
\>:锚定词尾;
格式:\<字符 或者 字符\>;当需要锚定词首时锚定符需要放在词的前面,同理,需要锚定词尾时锚定符需要放在词的后面;
分组:
\(\):将内容进行分组以便后续引用;
使用格式:
\(ab\)*xy;匹配ab这个组合重复任意次后面跟xy的行;
引用:引用对应的的分组;
\1:引用第一个分组内的字符,注意此处引用是完全引用,即分组1当中匹配到什么字符此处引用时也引用什么字符;
例:\(a.b\)xy\1;a6bxya6b匹配;
\2:引用第二个分组的内容;
\3:
...
以上是基本grep的正则表达式类型,之前还说道有种扩展的正则表达式,egrep或grep -E;下面了解一下egrep的正则表达式;
egrep的正则表达式与普通grep没有特别大的区别,其也是分为:
字符匹配:
次数匹配:
锚定:
行锚定:
锚定行首;
锚定行尾;
词锚定:
锚定词首;
锚定词尾;
分组:
引用:
但egrep与grep相比起来不再需要使用\对其后符号进行转义,即可以直接使用符号来进行匹配;同时也多了一个|字符;
|:代表或者;对其前后词组进行匹配;
例:abc|ABC;此处匹配结果是abc或ABC,而不是abcBC或abABC;
egrep -E “Con(c|C)at”;其意义是Concat或者ConCat;因为使用了分组符所以在对非词组进行|匹配时,需要使用分组进行协助;
经典练习:
找出ifconfig Command结果中的1到255之间的整数;或者之前无法写;
解:
ifconfig | egrep --color "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
写一个模式,能匹配真正意义上的IP地址:(1.0.0.1--223.255.255.254);
解:
egrep --color "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>)\.(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){1}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"