grep与正则表达式

grep与正则表达式

grep

使用语法:grep [-abcEFGhHilLnqrsvVwxy][-C<显示列数>][-e<范本样式>][-f<范本文件>][范本样式][文件或目录...] 

功能说明:查找指定文件或标准输入里符合条件的字符串 
常用选项

-a 或–text 不要忽略二进制的数据。 
-A<显示列数>或–after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。 
-b 或–byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。

1.[root - gwx-st ~/test]#>grep -A1 -B1 -b "^bin" passwd 
2.0-root:x:0:0:root:/root:/bin/bash
3.32:bin:x:1:1:bin:/bin:/sbin/nologin
4.65-daemon:x:2:2:daemon:/sbin:/sbin/nologin

-B<显示列数>或–before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。

1.[root - gwx-st ~/test]#>head -3 passwd 
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin
5.[root - gwx-st ~/test]#>grep -A1 -B1 "^bin" passwd
6.root:x:0:0:root:/root:/bin/bash
7.bin:x:1:1:bin:/bin:/sbin/nologin
8.daemon:x:2:2:daemon:/sbin:/sbin/nologin

-c 或–count 计算符合范本样式的列数。

1.[root - gwx-st ~/test]#>grep -c "^bin" passwd 
2.1
3.[root - gwx-st ~/test]#>grep  "^bin" passwd
4.bin:x:1:1:bin:/bin:/sbin/nologin

-C<显示列数>或–context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

1.[root - gwx-st ~/test]#>grep -C1 "^bin" passwd 
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin

-d<进行动作>或–directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。 
-e<范本样式>或–regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。 
-E 或–extended-regexp 将范本样式为扩展正则表达式来使用。

1.[root - gwx-st ~/test]#>grep "^ro+t" passwd 
2.[root - gwx-st ~/test]#>grep -E "^ro+t" passwd
3.root:x:0:0:root:/root:/bin/bash
4.[root - gwx-st ~/test]#>grep "^ro\+t" passwd
5.root:x:0:0:root:/root:/bin/bash

-f<范本文件>或–file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep 查找符合范本条件的文件内容,格式为每列一个范本样式。

1.[root - gwx-st ~/test]#>cat username.list
2.root
3.gwx
4.test
5.[root - gwx-st ~/test]#>grep -f username.list passwd
6.root:x:0:0:root:/root:/bin/bash
7.operator:x:11:0:operator:/root:/sbin/nologin
8.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash
9.test1:x:1012:1012::/home/test1:/bin/bash
10.test2:x:1013:1013::/home/test2:/bin/bash

-F 或–fixed-regexp 将范本样式视为固定字符串的列表。即不适用正则表达式。

1.[root - gwx-st ~/test]#>grep "^bin" passwd 
2.bin:x:1:1:bin:/bin:/sbin/nologin
3.[root - gwx-st ~/test]#>grep -F "^bin" passwd
4.[root - gwx-st ~/test]#>

-G 或–basic-regexp 将范本样式视为正则表达式来使用。默认使用的基本正则表达式。 
-h 或–no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。默认选项。 
-H 或–with-filename 在显示符合范本样式的那一列之前,标示该列所属的文件名称。

1.[root - gwx-st ~/test]#>grep -H "^gwx" passwd 
2.passwd:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash

-i 或–ignore-case 忽略字符大小写的差别。

1.[root - gwx-st ~/test]#>grep -i "^GWX" passwd 
2.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash

-l 或–file-with-matches 列出文件内容符合指定的范本样式的文件名称。

1.[root - gwx-st /]#>grep -r -l "root.*" ~/test/
2./root/test/passwd
3./root/test/username.list

-L 或–files-without-match 列出文件内容不符合指定的范本样式的文件名称。

1.[root - gwx-st /]#>grep -r -L "root.*" ~/test/
2./root/test/test1
3./root/test/test2

-n 或–line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。

1.[root - gwx-st ~/test]#>grep -n "^gwx" passwd 
2.22:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash

-q 或–quiet 或–silent 不显示任何信息。 
-r 或–recursive 此参数的效果和指定“-d recurse”参数相同。

1.[root - gwx-st /]#>grep -r "root.*" ~/test/
2./root/test/passwd:root:x:0:0:root:/root:/bin/bash
3./root/test/passwd:operator:x:11:0:operator:/root:/sbin/nologin
4./root/test/username.list:root

-s 或–no-messages 不显示错误信息。

1.[root - gwx-st /]#>grep  -L "root.*" ~/test/
2.grep: /root/test/: Is a directory
3./root/test/
4.[root - gwx-st /]#>grep  -L -s "root.*" ~/test/
5./root/test/

-v 或–revert-match 反转查找。

1.[root - gwx-st ~/test]#>cat test2
2.ad
3.ag
4.ga
5.[root - gwx-st ~/test]#>grep -v "^a" test2
6.ga

-V 或–version 显示版本信息。 
-w 或–word-regexp 只显示全字符合的列。 
-x 或–line-regexp 只显示全列符合的列。 
-y 此参数的效果和指定“-i”参数相同。 
-o 只显示与范本样式匹配的字符串

1.[root - gwx-st ~/test]#>grep -o "^a" test2
2.a
3.a
4.[root - gwx-st ~/test]#>grep  "^a" test2
5.ad
6.ag

正则表达式

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。此处的*为通配符。 
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 
下面我们来看一下正则表达式所支持的常用元字符

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(“。
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,如需引用则使用 \1…。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符(|)来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\< 匹配一个单词的词首
> 匹配一个单词的词尾
\B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。

   好了,接下来让我们实践一下吧~~

显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。

1.[root - gwx-st ~/test]#>ls /var |grep -E "^l.*[[:digit:]]+.*[[:lower:]]$"
2.l1b
3.ll2a2iii3d

显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。

1.[root - gwx-st ~/test]#>ls /etc/ |grep  "^[0-9].*[^0-9]$"
2.1agasga21dad

显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。

1.[root - gwx-st ~/test]#>ls /etc/ |grep -E "^[^[:alpha:]][[:alpha:]]+.*"
2.1agasga21dad

复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。

1.[root - gwx-st ~/test]#>cp -rf /etc/p*[^0-9] /tmp/mytest1

复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。

1.[root - gwx-st ~/test]#>cp -rf /etc/*.d  /tmp/mytest2

复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

1.[root - gwx-st ~/test]#>cp -rf /etc/[lmn]*.conf /tmp/mytest3

原创文章,作者:N24-wenxuan,如若转载,请注明出处:http://www.178linux.com/57632

(0)
上一篇 2016-11-05 12:45
下一篇 2016-11-05 16:51

相关推荐

  • 0805linux基础小记(正则匹配)

    cat -ns file   //-s,压缩重复的空行 cat -T f1  //看到tab键 cat f1|tr '\t' '\r' > f2 cat -v f2 //看到^M   tac file //倒的显示 rev file //反向显示每一行 echo {1..10} &g…

    Linux干货 2016-08-07
  • Jumpserver 3.0 全新改版 更轻、更快、更便捷

               Jumpserver Wiki                       &…

    系统运维 2016-01-05
  • linux文件的时间

    1,linux文件有哪些时间属性     access time:atime 访问时间:即查看访问文件的时间     modify time:mtime 修改时间:修改文件内容的时间     change time:ctime 改变时间:修…

    Linux干货 2016-06-09
  • 马哥教育网络班22期+第1周课程练习

    1、描述计算机的组成及其功能 CPU:运算器、控制器、寄存器、缓存 存储器:内存,RAM(Random Access Memory) Input:下指令,提供数据等 Output:输出数据加工的结果 2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别 Debian系列         ubuntu &n…

    Linux干货 2016-08-15
  • bash的工作特性之命令执行状态返回值和命令行展开

    bash特性之一:命令别名 将一个命令用其他名字来代替,可以用别名来简化操作。 获取当前用户可用的别名的定义: ~]#alias NAME=’COMMAND’ bash的特性之二:命令历史 shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件; HISTSIZE:shell进程的…

    Linux干货 2016-11-06
  • 对软连接进行cp,rm

    软连接的原理 图1 由 1 号inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的inode , 最终就能够读取到正确的数据了。 软连接的使用 创建软连接,从下图可以看出软连接的大小是11个字节,对比/etc/passwd和passwdlns可知他们不是同一个文件。 在复制cp的时候对软连接的处理 对指向文件的的软连接:使用cp …

    Linux干货 2017-02-25

评论列表(1条)

  • 马哥教育
    马哥教育 2016-11-10 17:17

    赞,grep 总结的比较详细~~排版也比较好~继续加油~