grep:打印匹配给定模式的行
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来);是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局搜索正则表达式并打印,它的使用权限是所有用户。
格式:
grep [OPTIONS] PATTERN [FILE...]
常用选项:
--color=auto:一般先定义个别名(alias grep="grep --color=auto")
-v: 反向选取;--invert-match 改变匹配的意义,只选择不匹配的行。
-o: -only-matching,仅显示匹配的行中与 PATTERN 相匹配的部分,而非字串所在的行。
-i: ignore-case,忽略字符大小写
-E: --extended-regexp ,支持使用扩展正则表达式,(将模式 PATTERN 作为一个扩展的正则表达式来解释 ),等同于egrep。
-c:计算“查找字符串”的次数。
-A # :after,显示匹配的行之后的下文N行
-B # :before,显示匹配的行之前的上文N行
-C # :context,显示匹配的行的上下和下文各N行
各选项简单示例 :
正则表达式
定义:
正则表达式(Regular Expression)就是处理字符串的方法,它是以“行”为单位来进行字符串的处理行为,正则表达式通过一些特殊字符的辅助,可以让用户轻易达到查找、替换、删除一行或多行文字字符串。
组成:
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
元字符(Meta-Characters)是正则表达式中具有特殊意义的专用字符,用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
应用:
正则表达式并不是一个工具程序,而是一种字符串处理的标准依据,如果你想要以正则表达式的方式处理字符串,就得要使用支持正则表达式的工具程序才行,这类的工具程序很多,如vi,grep,sed,awk等工具。
正则表达式与通配符区别
通配符一般只用于文件名匹配,它是由shell解析的;正则表达式是用来匹配字符串的,般用在工具软件(grep、awk、sed等)或者支持正则的语言(javascript、perl、java、c++等)进行字符串处理时,它是有使用它的工具软件或者是语言的库模块来解释。
egrep正则表达式元字符:
单个字符的元字符:
.: 匹配任意单个字符
[]: 字符组,匹配单个列出的字符定义一个字符集合,匹配该集合中的一个字符
[^]: 排除型字符组,匹配单个未列出的字符;对字符集合求非(是对整个集合求非,而不是紧挨着^符号的字符)
在字符集合中定义一个区间。如[A-Za-z]
\char 转义字符 若char是元字符,或转义序列无特殊含义时,匹配char对应的普通字符
数量元字符:用于实现指定其前面的字符所能够出现的次数
*: 匹配其前面的字符可以出现零次或多次
?: 0次或1次,它前面的字符是可有可无的
{m}: m次,它前的字符要出现m次
{m,n}: 至少m次,至多n次
{m,}:至少m次
{0,n}: 至多n次
+ :加号,至少需要匹配一次,至多可能任意多次
.*:任意长度的任意字符;工作于贪婪模式:尽可能多的去匹配
位置锚定元字符:
^: 行首锚定;脱字符
$: 行尾锚定:
^$: 空白行 不包含特殊字符的连续字符组成的串叫单词:
\<: 单词分界符,单词开头,等同\b,出现于单词左侧
\>: 单词分界符,单词结尾,等同\b
\b:单词边界(单词的开头和结束)
分组:
( ) 分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用
引用:
\#: 引用第n个括号所匹配到的内容,而非模式本身
或者:
a|b: a或者b
shell转义符
有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。
字符 |
说明 |
‘’(单引号) |
又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。 |
“”(双引号) |
又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替 |
\(反斜杠) |
又叫转义,去除其后紧跟的元字符或通配符的特殊意义。 |
实例:
$ ls \*.txt ls: 无法访问 *.txt: 没有那个文件或目录 $ ls '*.txt' ls: 无法访问 *.txt: 没有那个文件或目录 $ ls 'a.txt' a.txt $ ls *.txt a.txt b.txt |
可以看到,加入了转义符 “*”已经失去了通配符意义了。
表达式全集:
shell解析脚本的过程
大家可能会想特殊字符,通配符,那么 shell在得到一条命令,到达是怎么样处理的呢?我们看下下面的图:
如果用双引号包括起来,shell检测跳过了1-4步和9-10步,单引号包括起来,shell检测就会跳过了1-10步。也就是说,双引号 只经过参数扩展、命令代换和算术代换就可以送入执行步骤,而单引号转义符直接会被送入执行步骤。而且,无论是双引号转义符还是单引号转义符在执行的时候能够告诉各个命令自身内部是一体的,但是其本身在执行时是并不是命令中文本的一部分。