共计 3766 个字符,预计需要花费 10 分钟才能阅读完成。
grep 命令介绍
作用
Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
格式
grep [options]
主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern 正则表达式主要参数:
\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[]:单个字符,如 [A] 即 A 符合要求。
[–]:范围,如[A-Z],即 A、B、C 一直到 Z 都符合要求。
。:所有的单个字符。
*:有字符,长度可以为 0。
grep 命令使用简单实例
$ grep ‘test’ d*
显示所有以 d 开头的文件中包含 test 的行。
$ grep ‘test’ aa bb cc
显示在 aa,bb,cc 文件中匹配 test 的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行。
$ grep ‘wesest.*\1’ aa
如果 west 被匹配,则 es 就被存储到内存中,并标记为 1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个 es(\1),找到就显示该行。如果用 egrep 或 grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
经典应用场景
除非要精确区分大小写,否则请加上 - i 来忽略大小写
结合 find 命令和管道
想要实现你的一个音乐文件夹里有多种格式的文件,而你只想找到艺术家 jay 的 mp3 文件,并且不含有任何的混合音轨
命令[root@localhost ~]#find . -name “.mp3” | grep -i jay | grep -vi “remix”
分析 1)使用 find -name 来列出所有 mp3 文件,重定向给 grep2) 使用 grep -i 来查找包含 jay 的行 3)使用 grep -vi 来查找不包含 remix 的行
-A -B -C
很多时候,我们并关心匹配行而是关心匹配行的上下文。这时候 -A -B - C 就有用了 -A n 后 n 行,A 记忆为(After)-B n 前 n 行,B 记忆为(Before)-C n 前 n 行,后 n 行,C 记忆为(Center)
举例
[root@localhost ~]# ifconfig | grep -A 2 “Link encap”
eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:38:15
inet addr:192.168.91.129 Bcast:192.168.91.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef3:3815/64 Scope:Link
—
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
[root@localhost ~]# ifconfig | grep -C 2 “lo”
Interrupt:67 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
用 - c 来统计数目
你手头有一个很大的文件,这个文件包含网址,比如 www.baidu.com tieba.baidu.com 等等。你想要知道有多少个隶属于百度的网址。
命令 root@localhost ~]# grep -c “*baidu.com*” filename
例子
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
“123”
123″”123
njuhwc@163.com
njuhwc@gmil.com 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -cn “.*baidu.com.*” file.txt
3
-r 递归查找子目录
查找当前目录及其子目录下面包含匹配字符的文件
查找子目录,匹配后输出行号,这里的点表示当前目录
命令(查找当前路径下所有文件中, 含有 baidu 的文件)[root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
例子
#查找当前路径下所有文件中, 含有 `baidu` 的文件
[root@localhost ~]# grep -nr baidu .
./file.txt:8:www.baidu.com
./file.txt:9:tieba.baidu.com
./file.txt:11:www.baidu.com/search/index
./test/test.txt:1:http://www.baidu.com
命令(查找子目录,匹配后只输出文件名)[root@localhost ~]# grep -lr HELLO_HWC_CSND_BLOG* .
例子
#查找子目录,匹配后只输出文件名
[root@localhost ~]# grep -lr baidu .
./file.txt
./test/test.txt
查找不包含某一个目录
命令[root@localhost ~]#grep -R –exclude-dir=node_modules ‘some pattern’ /path/to/search
例子
[root@localhost ~]# ls
anaconda-ks.cfg Desktop file.txt find.result install.log install.log.syslog test
[root@localhost ~]# grep -r baidu .
./file.txt:www.baidu.com
./file.txt:tieba.baidu.com
./file.txt:www.baidu.com/search/index
./test/test.txt:http://www.baidu.com
这时候如果我们不想包含 test 目录
[root@localhost ~]# grep -R –exclude-dir=text “baidu” .
./file.txt:www.baidu.com
./file.txt:tieba.baidu.com
./file.txt:www.baidu.com/search/index
如果报错 grep: unrecognized option `–exclude-dir=test’ 说明版本过老,更新下就 ok
查找 IP 地址
命令说明这里用到了 - o 和 - P 命令我们通过 man grep 查看 -o, –only-matching:Show only the part of a matching line that matches PATTERN.-P, –perl-regexp:Interpret PATTERN as a Perl regular expression. 也就是说 -o,只显示匹配行中匹配正则表达式的那部分 -P,作为 Perl 正则匹配
举例
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
“123”
123″”123
njuhwc@163.com
njuhwc@gmil.com 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -oP “([0-9]{1,3}\.){3}[0-9]{1,3}” file.txt
192.168.0.1
162.12.0.123
查找邮箱
命令说明[root@localhost ~]# grep -oP “[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+” file.txt
例子
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
“123”
123″”123
njuhwc@163.com
njuhwc@gmil.com 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -oP “[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+” file.txt
njuhwc@163.com