grep

1.Grep 命令
1.1.Grep 命令的介绍
             grep 这个命令是一个全局查找正则表达式并且打印结果行的命令。它的输入是一个文件或者是一个标准输入(stdin),或者是一个“-”连字符(),????待查阅后解释。它的输出一般是打印在里屏幕上。grep 家族里还有 egrep 和 fgrep 这两个命令,这里我们就不做介绍了。


1.2.Grep 是如何工作的
          grep 命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格,就必须用引号把它括起来。grep 命令中,模式可以是一个被引号括括起来的字符串,也可以是单个词,位于模式之后所有的单词都被视为文件名。grep 将输出发送到屏幕,它不会对输入文件进行任何修改或变化,下面我们以一个命令来说明。
命令格式
grep [选项] 模式 [文件....]
案例 1:

grep Tom /etc/passwd

        grep 将在文件中查找/etc/passwd 中查找模式 Tom。如果查找成功,文件中相应行会显示在屏幕上,如果没有找到指定的模式,就不会有任何输出,如果指定的文件不是一个合法的文件,屏幕上就会显示报错信息。如果发现了要查找的模式,grep 就返回退出状态 0,表示成功,如果没找到,返回的退出状态为 1,而找不到指定文件时,退出状态将是 2。
        grep 的程序输入可以来自标准输入或管道,而不仅仅是文件。如果忘了指定文件,grep会以为你要它从标准输入(即键盘)获取输入,于是停下来等你健入一些字符。如果输入来自管道,就会有另一条命令的输出通过管道变成 grep 命令的输入,如果匹配到要查找的模式,grep 会把输出打印在屏幕上。
案例 2:

ps -ef |grep root

    ps 命令的输出被送到 grep,然后所有包含 root 的行都被打印在屏幕上。

2.正则表达式元字符和选项
2.1.正则表达式元字符
       元字符也是一种字符,但他表达的含义不同于字符本身的字面含义。例如,^和$就是元字符。grep 支持很多正则表达式元字符,以便用户更精确的定义要查找模式。
       正则表达式元字符

2.2.grep 选项
        grep 选线用于调整执行查找或显示结果的方式。例如通过选线来关闭大小写敏感、要求显示行号,或者只显示报错信等。          grep 选项

3.使用正则表达式 grep 实例

3.1.grep 的测试实例

测试文件

northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

案例 1:

[root@onetree-test001 /data/data/grep]# grep NW ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34

说明:
打印文件 grep.txt 文件包含正则表达式 NW 的行
案例 2:

[root@onetree-test001 /data/data/grep]# grep ^n ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9

说明:
打印以字母 n 开头的行,(^)行首定位符
案例 3:

[root@onetree-test001 /data/data/grep]# grep "4$" ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34

说明:
打印所有以数字 4 结尾的行。($)行尾定位符
案例 4:

[root@onetree-test001 /data/data/grep]# grep 'TB Savage' ceshi.txt 
eastern EA TB Savage 4.4 .84 5 20

说明:
打印所有包含 TB Savage 的行。如果不用引号(这个例子中,使用单引号或双引号都可以),TB 和 Savage 之间的空格将导致 grep 会在 Savage 和 grep.txt 查找 TB。所以,如果字符串之间有空格,必须要用引号引起来。
案例 5:

[root@onetree-test001 /data/data/grep]# grep '5\..' ceshi.txt 
western WE Sharon Gray 5.3 .97 5 23
southern SO Suan Chin 5.1 .95 4 15
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13

说明:
打印所有包含数字 5,后面跟一个.号 再跟一个任意字符的行。 (.)号代表单个字符,被(\)转义后,只代表本身一个.号。
案例 6:

[root@onetree-test001 /data/data/grep]# grep '^[we]' ceshi.txt 
western WE Sharon Gray 5.3 .97 5 23
eastern EA TB Savage 4.4 .84 5 20

说明:
打印所有字母 w 和 e 开头的行。[]表示任意一个字符都可以匹配。
案例 7:

[root@onetree-test001 /data/data/grep]# grep '[^0-9]' ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

 说明:
 打印包含非数字字符的行。由于至少每一行有一个非数字字符,因此说有行都被打印。
案例 8:

[root@onetree-test001 /data/data/grep]# grep '[A-Z][A-Z] [A-Z]' ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

说明:
打印了包含两个大写字符、后跟一个空格和一个大写字符的行,例如 TB Savage 和 MBMain。
案例 9:

[root@onetree-test001 /data/data/grep]# grep 'ss*' ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13

说明:
打印包含一个 s、后跟 0 个或多个连着的 s 和一个空格的文本行。
案例 10:

[root@onetree-test001 /data/data/grep]# grep '[a-z]\{9\}'  ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13

说明:
打印所有出现至少 9 个小写字母连在一起的行,例如,northwest,southwest,southeast,northeast。
案例 11:

[root@onetree-test001 /data/data/grep]# grep '\(3\)\.[0-9].*\1 *\1' ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34

说明:
如果某一行包含一个 3 后面跟一个句点和一个数字,再任意多个字符(.*),然后跟一个 3个或任意多个制表符,再接一个 3,则打印该行。
案例 12:

[root@onetree-test001 /data/data/grep]# grep '\<north\>' ceshi.txt 
north NO Margot Weber 4.5 .89 5 9

说明:
打印所有包含单词 north 的行。“\<”是词首定位符“\>”是词尾定位符。
案例 13:

[root@onetree-test001 /data/data/grep]# grep '\<[a-z].*n\>'  ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southern SO Suan Chin 5.1 .95 4 15
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13

说明:
打印所有包含以小写字母开头,以 n 结尾,中间由任意多个字符组成的单词的行。注意符号.*,他代表任意字符,包括空格。3.3.2.grep 选项测试案例测试文件同上面那个
案例 14:  

[root@onetree-test001 /data/data/grep]# grep -n "north" ceshi.txt 
1:northwest NW Charles Main 3.0 .98 3 34
7:northeast NE AM Main Jr. 5.1 .94 3 13
8:north NO Margot Weber 4.5 .89 5 9

说明:
选项-n 在找到指定模式的行前面加上其行号再一并输出。
案例 15:

[root@onetree-test001 /data/data/grep]# grep -i 'pat'  ceshi.txt 
southeast SE Patricia Hemenway 4.0 .7 4 17

说明:
选项-i 关闭大小写敏感性。表达式 pat 包含任意大小写的组合都符合。
案例 16

[root@onetree-test001 /data/data/grep]# grep -v 'Suan Chin' ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

说明:
这个实例中,选项-v 打印所有不含模式 Suan Chin 的行。选项-v 可用来删除输入文件汇中特定的条目。如果真要删除这些条目,就要把 grep 的输出重定向到一个临时文件中,然后把临时文件的名字改成原文件的名字。注意不能从原文件重定向到原文件,这样会破坏原文件的。
案例 17:

root@onetree-test001 /data/data/grep]# grep -l 'SE*' ceshi.txt ../sed/ceshi.txt 
ceshi.txt
../sed/ceshi.txt

说明:
选项-l 使 grep 只输出包含模式的文件名,而不输出文本行。
案例 18:

[root@onetree-test001 /data/data/grep]# grep -c 'west' ceshi.txt 
3

说明:
选项-c 让 grep 打印出含有模式的行的数目。这个数字并不代表模式的出现次数。例如,即使 west 在某行中出现 3 次,这行也只计一次。
案例 19:

[root@onetree-test001 /data/data/grep]# grep -w 'north' ceshi.txt 
north NO Margot Weber 4.5 .89 5 9

说明:
选项-w只查找作为一个词,而不是词的一部分出现的模式。这条命令只打印包含词north的行,而不打印那些 northwest、northwest 等中出现的行。
3.3.grep 与管道

grep 的输入不一定都是文件,它也常常从管道读取输入。
案例 20:

[root@onetree-test001 /data/data]# ll
total 36
drwxr-xr-x 2 root root 4096 Jul 16 18:33 awk
-rw-r--r-- 1 root root   70 Jul 16 16:54 awk.txt
drwxr-xr-x 2 root root 4096 Jul 17 14:56 grep
-rw-r--r-- 1 root root   69 Jul 16 16:41 hello.txt
-rw-r--r-- 1 root root  107 Jul 16 16:52 recode.txt
drwxr-xr-x 2 root root 4096 Jul 17 14:12 sed
-rw-r--r-- 1 root root   24 Jul 16 16:31 space.txt
-rw-r--r-- 1 root root   10 Jul 16 16:27 tab.txt
-rw-r--r-- 1 root root  120 Jul 16 11:31 test.txt
[root@onetree-test001 /data/data]# ls |grep "gerp"
[root@onetree-test001 /data/data]# ls |grep "grep"
grep
[root@onetree-test001 /data/data]# ls |grep "^gr"
grep

说明:
ls 的命令的输出通过管道传给 grep。输出结果字母 gr 开头的所有行都被打印出来了,也就是说,被选中的目录被打印出来了。
3.4.egrep 扩展
egrep 在 grep 的基础上增加了更多的元字符。但是 egrep 不允许使用\(\),\{\}.

案例 21:

[root@onetree-test001 /data/data/grep]# grep "west|north" ceshi.txt 
[root@onetree-test001 /data/data/grep]# egrep "west|north" ceshi.txt 
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9

说明:
grep 不支持“|”这个,egrep 支持“|”,egrep 查到了,包含 west 或者 north 的行。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值