转载:https://blog.51cto.com/hujiangtao/1923675
[命令简介]
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
[功能说明]
grep***** ==擅长过滤器,把想要的或者不想要的分离开。Linux三剑客 老三。
[用法格式]
grep [选项]... PATTERN [FILE]...
[参数选项]
[options]主要参数:
-c:只输出匹配行的计数。 -i:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:排除,不显示过滤的字符串的行;显示不包含匹配文本的所有行
-E :过滤多个字符串
-o :输出精确匹配的字符而不是默认的整行
-f :指定规则文件,其内容含有一个或多个规则样式
让grep查找符合规则条件的文件内容,格式为每行一个规则样式
#Context control:
-B 除了显示匹配的一行之外,并显示该行之前的num行
-A 除了显示匹配的一行之外,并显示该行之后的num行
-C 除了显示匹配的一行之外,并显示该行之前后各num行
grep "String" -B 10 test.txt #显示匹配的String行和String的前10行。
pattern正则表达式主要参数:
\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如 [Gg]rep 匹配Grep和grep。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。
[^]:匹配一个不在指定范围内的字符
如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行
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的行
.:所有的单个字符。
*:有字符,长度可以为0。
[实践案例]
实战准备: 1、调整别名 alias grep='grep --color=auto' 注意字符集:可能带来的问题 export LC_ALL=C
1、查找指定进程:
2、查找指定进程个数:
#匹配进程输出多少行的计数。这里表示sshd输出有6行。
3、从文件中读取关键词进行搜索:
[root@localhost test]# cat test.txt hnlinux peida.cnblogs.com ubuntu ubuntu linux redhat Redhat linuxmint [root@localhost test]# cat test2.txt linux Redhat [root@localhost test]# cat test.txt | grep -f test2.txt hnlinux ubuntu linux Redhat linuxmint [root@localhost test]#
#输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行。
4、从文件中读取关键词进行搜索 且显示行号:
[root@localhost test]# cat test.txt hnlinux peida.cnblogs.com ubuntu ubuntu linux redhat Redhat linuxmint [root@localhost test]# cat test2.txt linux Redhat [root@localhost test]# cat test.txt | grep -nf test2.txt 1:hnlinux 4:ubuntu linux 6:Redhat 7:linuxmint [root@localhost test]#
#输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行,并显示输出每一行的行号。
5、从文件中查找关键词 并显示行号:
[root@localhost test]# grep 'linux' test.txt hnlinux ubuntu linux linuxmint [root@localhost test]# grep -n 'linux' test.txt 1:hnlinux 4:ubuntu linux 7:linuxmint [root@localhost test]#
#显示匹配字符串’linux’的行,并且显示输出行的行号。
6、从多个文件中查找关键词:
7、grep不显示本身进程:
8、找出以u开头的行内容:
9、输出非u开头的行内容:
10、输出以hat结尾的行内容:
11、ifconfig匹配过滤出ip地址:
# "([0-9]{1,3}\.){3}[0-9]" 表示匹配包含3个 ([0-9]{1,3}\.) 字符串的行,并且后面匹配有[0-9]中的数字。
12、显示包含ed或者at字符的内容行:
#‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。使用egrep等于使用grep -E。
13、显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行:
14、上下文控制Context control参数选项的使用:
-B 除了显示匹配的一行之外,并显示该行之前的num行
-A 除了显示匹配的一行之外,并显示该行之后的num行
-C 除了显示匹配的一行之外,并显示该行之前后各num行
使用格式: grep "String" -B 10 test.txt
15、正则表达式案例一:
案例文件内容: [root@oldboy oldboy]# cat oldboy.log I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! ============================================ 实战举例: 1)^word 搜索以word开头的。vi ^一行的开头 2)word$ 搜索以word结尾的。vi $一行的末尾 3)^$ 表示空行,能理解么? ============================================
a.过滤出来以m开头的行 [root@oldboy log]# grep "^m" oldboy.log my blog is http://oldboy.blog.51cto.com my qq num is 49000448. my god ,i am not oldbey,but OLDBOY! b.过滤出来以m结尾的行 [root@oldboy log]# grep "m$" oldboy.log my blog is http://oldboy.blog.51cto.com [root@oldboy log]# cat -n oldboy.log 1 I am oldboy teacher! 2 I teach linux. 3 4 I like badminton ball ,billiard ball and chinese chess! 5 my blog is http://oldboy.blog.51cto.com 6 our site is http://www.etiantian.org 7 my qq num is 49000448. 8 9 not 4900000448. 10 my god ,i am not oldbey,but OLDBOY! c.过滤掉空行 [root@oldboy log]# grep -v "^$" oldboy.log I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! [root@oldboy log]# grep -vn "^$" oldboy.log #过滤掉空行且显示行号 1:I am oldboy teacher! 2:I teach linux. 4:I like badminton ball ,billiard ball and chinese chess! 5:my blog is http://oldboy.blog.51cto.com 6:our site is http://www.etiantian.org 7:my qq num is 4900044 8. 9:not 4900000448. 10:my god ,i am not oldbey,but OLDBOY!
16、正则表达式案例二:
17、正则表达式案例三:
# "([0-9]{1,3}\.){3}[0-9]" 表示匹配包含3个 ([0-9]{1,3}\.) 字符串的行,并且后面匹配有[0-9]中的数字
小结:
grep一般常用参数:
“*”星越多表示越重要!五星最重要!
-a:在二进制文件中,以文本文件的方式搜索数据
没加-a前,匹配二进制文件会提示: [root@localhost ~]# grep 1 /bin/cp Binary file /bin/cp matches 加-a后,就可以匹配二进制文件了。但是匹配后会产生乱码,所以这里就不截图了。
#-a的乱码解决方法可以退出重新进入 或者setup然后退出。
-c:计算找到 ’搜索字符串’ 的次数
[root@localhost ~]# ps -ef|grep svn -c 2 [root@localhost ~]# ps -ef|grep -c sshd 6 [root@localhost ~]#
-o:仅显示出匹配regexp的内容
-i*****:忽略大小写的不同,所以大小写视为相同*****
-n*****:在行首显示匹配内容行的行号*****
-v*****:反向选择,即不显示 ‘搜索字符串’ 内容的那一行*****
-E*****:扩展的grep,即egrep*****
--color=auto***:以特定颜色高亮显示匹配关键字(不是整行)***
#提示: -i -v 为常用参数。
Context control上下文控制参数:
使用格式: grep "String" -B 10 test.txt
-A:After的意思,显示匹配字符串及其后n行的数据
-B:beforce的意思,显示匹配字符串及其前n行的数据
-C:显示匹配字符串及其前后各num行的数据