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)
N24-wenxuanN24-wenxuan
上一篇 2016-11-05
下一篇 2016-11-05

相关推荐

  • 在CentOS 6上编译安装LAMP

    在CentOS 6上编译安装LAMP     在生产中如果需要使用较新的服务,而系统提供的rpm包又较老时该怎么办呢?其实应用程序的安装方式有多种,如:使用系统发行商提供rpm包或者下载源码包手动编译安装也是可以的。今天我们编译的服务不是一个单独的而是一套。这套黄金搭档从诞生之初到现在已经经过无数用户的验证,各大电商站点、门户网站、以及各…

    Linux干货 2017-04-23
  • 网络接口bonding的设置、网卡别名的设置

    网络接口bonding的设置、网卡别名的设置 网络接口bonding的设置 1.bonding的原理 Bonding就是将多块网卡绑定同一IP 地址对外提供服务,可以实现高可用或者负载均衡。当然,直接给两块网卡设置同一IP 地址是不可能的。通过bonding ,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC 地址。 2.Bonding 的工作模式 …

    Linux干货 2016-09-05
  • 系统启动流程

    linux系统启动流程 内核的设计结构单内核:linux(线程–lwp轻量级进程)微内核:windows(支持真正意义上的多线程) 单内核:很多功能驱动都集成在一起 微内核:内核很小,功能单一。模块化 linux为了适应众多用户的不同硬件需求,linux内核在设计上采用模块化设计。可以动态加载模块。核心模块:ko 内核所独有的。共享对象:so 红…

    Linux干货 2016-09-19
  • Linux第八周小结

    1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态 在线的主机使用绿色显示 不在线的主使用红色显示 #!/bin/bash # for i in {1..254};do if ping -c 6 -w 1 192.168.1.$i &> /dev/null;then echo -e…

    Linux干货 2017-08-20
  • Flex Ant自动构建

    1.  Flex SDK Ant        Flex开发者会遇到很多,比如自动构建,在一个有着N多模块,N处源码,构建过程复杂的Flex项目开发中,依赖人力手工构建项目非常不现实(机械重复且枯燥无味的过程,相信哪位开发人员都会避之唯恐不及,而且对于人力是非常大的浪费),而通过使用Ant,我们可以将这些工作…

    Linux干货 2016-03-22
  • CentOS系统启动流程

       开机不是只要单击电源钮,而关机只要关掉电源钮就可以了吗?话是这样没错啦,但是由于 Linux 是一套多人多任务的操作系统,你难保你在关机时没有人在在线,如果你关机的时候碰巧一大群人在在线工作, 那会让当时在在线工作的人马上断线的!那不是害死人了!一些数据可是无价之宝。    另外 Linux 在执行的时候,虽然你…

    Linux干货 2016-09-19

评论列表(1条)

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

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