最近在复习linux基础,发现grep是个非常值得复习整理的一个命令,今天分享一下
grep [OPTIONS] PATTERN [FILE...]
OPTIONS: 参数,常用的-i,-o,-v
PATTERN:文字字符或正则表达式
FILE:操作文件对象,可操作多个文件
常用参数:
-i:忽略大小写
-v:显示文件所有行,默认只显示匹配到的行
-o:只显示匹配到的字符串
-E:使用扩展的正则表达式
-A#:#号代表任意非负整数,显示匹配到的行的同时,并显示后续的#行,A可理解为After
-B# :#号代表任意非负整数,显示匹配到的行的同时,并显示其前面的#行,B可理解为Before
-C# :#号代表任意非负整数,显示匹配到的行的同时,并显示其前面的#行及后面的#行
上面是grep的一些常用操作,而在使用过程中,要想真正发挥grep的强大功能,必须结合正则表达式,下面来简单介绍一下正则表达式的内容:
正则表达式:Regular Expression :简写为REGEXP
正则表达式的元字符:
*:匹配其前面的字符任意次,这点和我们常用的通配符*不太相同,切记!
.:匹配任意单个字符,要想实现匹配任意长度的任意字符,可以用: .*
?:匹配其前面字符0或一次
{m,n}:匹配其前面的字符至少m次,至多n次
^:行首标志
$:行尾标志
[]:指定匹配范围,其中的内容为或的关系,整个只匹配一个字符,如[A-Z],指的是A-Z之间任意一个字母,常用的字符集合有:
[:space:]空格
[:digit:]数字
[:lower:]小写字母
[:upper:]大写字母
[:alpha:]所有字母,包含大写和小写
[:panct:]标点符号
[:almun:]所有字符
表示任意一个大写字母,就可以使用[[:upper:]]
\<:其后字符(串)作为单词首部,如’\<abc’,表示匹配任意以abc开头的词
\>:其前字符(串)作为单词尾部
():内容分组,括号里面扩着的,为一组
\#:#号位任意正整数,后向引用,表示引用其前面的第#个分组
|:逻辑或
扩展正则表达式:
在元字符上,和上面提及的正则表达式差不多,差别在于扩展正则表达式在某些字符上面不需要进行转义,如(),[]等
上面说了那么多,大概大家都烦了,下面开始实战一下:
例一:找出/etc/passwd里为nologin的行
命令:grep nologin /etc/passwd
结果如下(内容较多,只显示部分内容):
例二:找出/etc/passwd里为mail的行,并显示其前两行,其后三行和前后各一行
其后两行:
[root@localhost ~]# grep -A 2 -i mail /etc/passwd
其前三行:
[root@localhost ~]# grep -B 3 -i mail /etc/passwd
前后三个一行:
[root@localhost ~]# grep -C 1 -i mail /etc/passwd
结果如下:
例三:在指定文件里面,找出形如l..e的字符串的行
命令:
[root@localhost ~]# grep 'l..e' test3.txt
结果如下:
例四:在指定文件里面,找出形如l..e的字符串
命令:
[root@localhost ~]# grep -o 'l..e' test3.txt
结果如下:
例五:在指定文件里,找出单独为root字符串的行
命令:
[root@localhost ~]# grep '^root$' test2.txt
结果如下:
例六:在指定文件里,找出含有root词的行
命令:
[root@localhost ~]# grep '\<root\>' test2.txt
结果如下:
例七:找出形如’l..e’,但前后要内容要相同
命令:
[root@localhost ~]# grep 'l\(..\)e.*l\1e' test3.txt
结果如下:
例八:使用扩展正则表达式,完成例七内容
命令:
[root@localhost ~]# grep -E 'l(..)e.*l\1e' test3.txt
例九:找出ifconfig里的类似0.0.0.0的内容
命令:
[root@localhost~]# ifconfig | grep -E '\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
结果如下: