三剑客之---grep

一、概述

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。


二、grep 基本用法:

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。

$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。

. 匹配一个非换行符的任意一个字符,如:/s.d/匹配s后接一个任意字符,最后是d。

* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

? 匹配0个或一个字符,如:ro?t   可以匹配 rt ;rot 。

+ 匹配1个或多个字符,如:ro?t    可以匹配 rot;root;rooot;roooooooooooot

[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。

[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。

& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。

x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。

x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。

x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。


三、示例

grep [-cinvABC] ‘word’ filename

# grep -A2 ‘root’ passwd

-A 后面跟数字,过滤出符合要求的行以及下面n行

-B 同上,过滤出符合要求的行以及上面n行

-C 同上,同时过滤出符合要求的行以及上下各n行

Centos 7开始系统自动增加了别名alias grep=’grep –color=auto’ 所以当筛选后一般都会呈现红色

# grep -c ‘root’ passwd               c:行数 //显示带有root关键字的行有多少行

# grep -n ‘nologin’ passwd           n:显示行数                 //显示带有nologin在原文中的段落号码

# grep -ni ‘nologin’ passwd                  i:不区分大小写                       //不区分nologin的大小写

# grep -niv ‘nologin’ passwd         v:取反           //找出不带有nologin的行

#grep -r ‘root’ /etc                -r:遍历所有子目录    //查找所有目录以及子目录文件中的 root 字符

# grep -w “bash” passwd      -w:精准匹配(例如在一个文本中有很多abc, abc1,abcaa,abc2;但我只需要abc,我们就需要-w 精准匹配)

grep/egrep示例

# grep ‘[0-9]’/etc/inittab      //匹配括号内的任意一个数字

# grep -v ‘[0-9]’/etc/inittab                   //匹配不带数字的行

# grep -n ‘^#’ /etc/inittab                  //以#开头的行

# grep -v ‘^#’ /etc/inittab                          //不以#开头的行

# grep ‘[^0-9]’ test.txt                  //非数字的行(只要不是数字,任何一个字符都可以匹配)

# grep ‘^[^0-9]’ test.txt                         //以非数字开头的行

# grep ‘[^a-z]’ test.txt               //非小写字母的行(只要不是小写字符,任何一个字符都可以匹配)

# grep ‘^[^0-9a-zA-Z]’ test.txt                   //非数字和字母开头的行,(匹配特殊字符)

^ 放在  []  里面是 取非 ^ 放在  [] 外面是  以…开头

# grep ‘r.o’ test.txt                . 任意一个字符

# grep ‘oo*’ test.txt                 * 左边的字符重复零次或多次

# grep ‘.*’ test.txt                      .* 任意一个任意字符

# grep ‘o\{2\}’ /etc/passwd                //匹配oo 两次的行; 并且使用脱意符号脱意 \{\}

# egrep ‘o{2}’ /etc/passwd               //egrep=grep -E,不需要脱意即可

# egrep ‘o+’ /etc/passwd 匹配 + 前面的字符一次或多次

# egrep ‘oo?’ /etc/passwd 匹配 ? 前面的字符0次或1次

# egrep ‘root|nologin’ /etc/passwd                    //匹配root或nologin的行

# egrep ‘root|nologin|1000’ /etc/passwd                    //匹配root或nologin或1000的行

# egrep ‘(oo){2}’ /etc/passwd                     //匹配 出现oo两次的行

四、

总结:

.             //任意一个字符

.*              //匹配任意个任意字符

?                 //匹配 ? 左边的字符0次或1次

*          //匹配 * 左边的字符重复0次或多次

+           //匹配 + 左边的字符1次或多次

|               //  或者

^    放在 [] 里面是 取非           ^ 放在 [] 外面是 以…开头

例如:

^  锚定行的开始 如:’^grep’匹配所有以grep开头的行。

$  锚定行的结束 如:’grep$’匹配所有以grep结尾的行。

.   匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。

*  匹配零个或多个先前字符 如:’ *grep’匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

[] 匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。

[^]  匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。

egrep=grep -E:

#egrep ‘root|nologin|1000’ /etc/passwd = #grep -E ‘root|nologin|1000’ /etc/passwd

原文地址:https://cloud.tencent.com/developer/article/1118985

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:三剑客之---awk
下一篇:13个适用于AdSense的wordpress 主题

发表评论

海外服务器,免备案,中国电信 CN2 GIA 高级回国优化专线

香港云服务器立即订购

4核4G  50G 2M (CN2 GIA)  335/月

8核8G  50G  2M(CN2  GIA)  613/月

香港物理服务器立即订购

Xeon L5630 *2    16GB DDR3    1TB HDD 或 240G SSD  10 Mbps  3IP 1500/月

8 核 16 线程 (2.13GHz)

Xeon E5 2650  16GB DDR3   1TB HDD/240G SSD/500G SSD  10 Mbps  3IP 2000/月

8 核 16 线程 (2.00GHz)