grep

8 grep

正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
    正则表达式的特点是:
  3. 灵活性、逻辑性和功能性非常的强;
  4. 可以迅速地用极简单的方式达到字符串的复杂控制。
  5. 对于刚接触的人来说,比较晦涩难懂。
    由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。

8.1 语法格式

格式一:
grep [选项] ‘正则表达式’ 文件列表
|
单引号

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename

格式二:
命令 | grep [选项] ‘正则表达式’

8.2 grep命令处理数据方式

以行为处理单位,对数据进行逐行处理(文件列表中有多个文件时,处理完一个文件中的所有行后再处理处理其它文件)
默认把文件中与正则表达式匹配数据所在的行打印(输出),不影响原文件内容。

8.3 grep选项

-v 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color可以将找到的关键词部分加上颜色的显示喔!
在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。 这可是个很不错的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又显的很麻烦~ 此时那个好用的 alias 就得来处理一下啦!你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦
-i 忽略字母大小写
-c计算找到 '搜寻字符串' 的次数
-n 输出与正则表达式匹配数据在文中的行号
-q 不输出与正则表达式匹配的行 #可以与echo $?结合在一块使用
-E使用支持扩展正则表达式,
主要好处是增加了额外的正则表达式元字符集。

对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。

grep 'NW|EA' testfile

northwest NW Charles Main 3.0.98 3 34
eastern EA TB Savage 4.4 .845 20
8.4 grep与正则表达式

元字符
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
元字符是一个或一组代替一个或多个字符的字符。听起来有点拗口,但举一个例子也许你就明白了:元字符*用来匹配0个或多个的前一字符;而元字符 . 用来匹配一个任意的一个字符。
8.4.1
^ 匹配行首
^a 匹配以字母a开头的行
^ab
8.4.2
a 匹配以字母a结尾的行
.匹配任意字符结尾的行      .表示任意匹配字符,如果想要匹配.本身需要加转义符.  8.4.3  ^ 匹配空行
grep ‘^plj$’ /etc/passwd
grep ‘plj’ /etc/passwd
注意上面2个例子的区别

8.4.4
. 匹配任意单个字符
grep ‘./etc/passwdgrep.’ /etc/passwd

8.4.5 匹配次数

  • 大于等于0
    {m,n}
    {m, }
    {m}
    {5}
    例子:
    + 匹配前边的正则表达式出现一次到多次
    \? 匹配前边的正则表达式出现0到1次
    例子:
    grep ‘go+d’ a.txt
    grep –E ‘go+d’ a.txt
    8.4.6
    (正则表达式) 把正则表达式当成一个整体
    grep –color ‘goood’ a.txt
    grep –color ‘g(ooo)
    d’ a.txt
    grep -E –color ‘g(ooo)*d’ a.txt

grep –color ‘g(ooo)*d’ a.txt

8.4.7
|
grep –v –color ‘^#|^’ a.txt  grep -E –v –color ‘^#|^’ a.txt
按鸟哥或老男孩思路整理:正则和扩展正则,什么时候用-E

8.4.8 范围内匹配
[] 匹配范围内任意字符
如t[ae]st
grep –color ‘[abc]’ a.txt
grep -E –color ‘a|b|c’ a.txt
[a-z] 匹配所有小写字母
[A-Z] 匹配所有大写字母
[a-Z] 匹配所有字母
[0-9] 匹配0-9所有数字
[a-Z0-9] 匹配所有字母和数字

8.4.8 范围内取反
(注意取反和开头都用的是^,但是用的位置不同,表示的意义也不同)

[^a-Z] 不匹配有字母的行

注意:因-在范围匹配中有特别的意义,所以如果想要匹配-,必须写在开头或结尾,不能写在中间
如:grep –color ‘[?#-]’ a.txt
grep –color ‘[?-#]’ a.txt (x) #写法正确,但不能满足需求。

grep –color ‘^[^a-z]’ a.txt
grep –color ‘^[^a-Z0-9]’ a.txt

注意2个^所表示意义的不同

8.4.9 匹配单词
\<匹配单词开头(出现在左侧)
head -6 /etc/init.d/sshd | grep –i –color ‘\<s’
head -6 /etc/init.d/sshd | grep –i –color ‘\<st’
\>匹配单词结尾(出现在右侧)
head -6 /etc/init.d/sshd | grep –i –color ‘l >’

综合例子:
需求:匹配MAC地址
00:0C:29:89:E0:C5

ifconfig | grep -E ‘(([a-z0-9]{2}):){5}[a-z0-9]{2}‘
若不加-E参数,()、{}等需要转义




posted @ 2019-01-30 17:28  whatislinux  阅读(158)  评论(0编辑  收藏  举报