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

相关推荐

  • 初识Linux-即使是997也不能停止学习

    1.计算机的组成及其功能:    从1946年第一台通用计算机ENIAC诞生至今,几乎所有的计算机系统都是建立在冯诺依曼体系结构上的。那么何为冯诺依曼体系结构? 冯诺依曼体系结构:        控制器:是整个计算机的中枢,负责计算机的整体调度工作,将指令从存储器中取出,并对指令进行解释执行。 &n…

    Linux干货 2016-10-29
  • sudo——让普通用户更灵活

    sudo命令 1、sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo ,会提示联系管理员 2、sudo可以提供日志,记录每个用户使用sudo 操作 3、sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机 4、sudo 使用时间戳文件来完成类似“检票”的 系统,默认存活期为5 分钟的 “入场券” …

    Linux干货 2016-09-25
  • 我的第一篇博客

    2018.3.26 整理

    2018-03-26
  • ansible批量部署主从DNS

    什么是DNS服务DNS的解析流程分析递归查询迭代查询DNS相关的术语说明生产环境中的应用Bind9常见配置说明使用ansible自动部署主从DNS 什么是DNS服务 DNS(Domain Name Service)是Internet上用于名称解析的服务,简单来说,就是将域名转换为IP地址的服务(正向解析),也可以用于将IP地址解析为对应的…

    Linux干货 2016-06-29
  • 推荐-CentOS 6的系统启动流程

    一、POST加电自检     按下电源后ROM芯片中的CMOS程序执行并检测CPU、内存等设备是否存在并正常运行,CMOS中的程序叫BIOS,可以设置硬盘接口,网卡声卡开关之类的简单设置。一般PC机主板上有一个纽扣电池,这个电池就是给ROM供电的,可以保证主板断电后BIOS的一些基本设置不会重置。  &nb…

    Linux干货 2016-04-10
  • Liunx系统命令的使用格式

    Liunx系统命令的格式 基本格式如下:               ~]# COMMAND OPTIONS ARGUMENTS COMMAND:      发起一个命令,请求内核将某个二进…

    Linux干货 2016-10-28

评论列表(1条)

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

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