1、前言
我们在使用过程中经常需要对当前获取的文件进行过滤、提取和分析,以便快速查找到含有指定内容的文件或指定信息的那些行。本章我们继续深入了解有关文本检索的内容。
2、grep 查找文件内容
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
grep全称是Global Regular Expression Print,表示全局正则表达式版本。
2.1、grep由来
grep 命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的模式(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输出(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,而这也就是 grep 命令的全称。
2.2、特点
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
同时也能在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子。
2.3、格式
grep 命令的基本格式如下:
[root@localhost ~]# grep [选项] 模式 文件名
说明:
这里的模式,要么是字符(串),要么是正则表达式。
grep 命令常用选项及含义
选项 | 含义 |
---|---|
-c | 仅列出文件中包含模式的行数。 |
-i | 忽略模式中的字母大小写。 |
-l | 列出带有匹配行的文件名。 |
-n | 在每一行的最前面列出行号。 |
-v | 列出没有匹配模式的行。 |
-w | 把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行。 |
注意:
- 如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;
- 如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行。
3、实操例子
我们现在针对已经学习过的Linux基础知识 -进行学习练习以检验学习效果。
1、假设文件fyydlz.txt的文本如下(可以利用touch命令和vi命令组合创建):
hello fyydlz world
wold hello
nothing is important
i like fyydlz fyydlz
hello world
wold hello
nothing is important
i like fyydlz fyydlz
grep 命令用来查找文本,这里是最常用的几个操作例子:
3.1、查找文件fyydlz.txt中含有"hello"字符串的行:
grep hello fyydlz.txt
3.2、使用正则表达式查找文件fyydlz.txt中含有数字的行:
grep -E "\d." fyydlz.txt
3.3、查找文件fyydlz.txt中不包含"hello"字符串的行:
grep -v hello fyydlz.txt
3.4、查找文件fyydlz.txt中含有"fyydlz"字符串的行以及它前面的3行:
grep fyydlz -B 3 fyydlz.txt
3.5、查找文件fyydlz.txt中含有"fyydlz"字符串的行以及它后面的3行:
grep fyydlz -A 3 fyydlz.txt
3.6、查找文件fyydlz.txt中含有"4."字符串的行以及它前后3行:
grep 4. -C 3 fyydlz.txt
4、日常运维用法
1、我们在生产环境服务器上,经常使用到下面这个命令:
ps -ef | grep java或nginx
显然,此处 grep的作用就是帮助筛选出那些运行中的java或nginx进程。
2、输出以 h 开头的行(不区分大小写)
grep "^h" fyydlz.txt -i -n
注: 这里的-i代表不区分大小写, -n代表显示匹配行和行号。
3、输出以.结尾的行
grep "\.$" fyydlz.txt -n
注: 因为.在这里有着特殊含义, 所以要用\转义一下, 如果不加转义字符的话, grep就会把它当做正则表达式来处理(.代表的含义是匹配任意一个字符)。
4、^$(代表空行的意思)组合符找出文件的空行, 以及行号
grep "^$" fyydlz.txt -n
5、.点符号
"."点表示任意一个字符, 有且只有一个, 不包含空行。
grep "." fyydlz.txt -n
6、*符号
"*"表示找出前一个字符0次或一次以上
找出文件中i出现0次或多次的行和行号。
grep "i*" fyydlz.txt -n
7、*.组合符
".*"表示所有内容, 包括空行。
grep ".*" fyydlz.txt -n
8、^.*z符 (含义: 以任意内容开头, 直到z结束)
grep "^.*z" fyydlz.txt -n
9、[abc]中括号
中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下:
- [a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母;
- [a-zA-Z]匹配所有的单个大小写字母;
- [0-9]匹配所有单个数字;
- [a-zA-ZO-9]匹配所有数字和字母;
- 匹配abc字符中的任意一个,得到它的行数和行号;
grep "[abc]" fyydlz.txt -n
10、 grep 参数-o
使用"-o"参数选项, 可以显示被匹配到的关键字, 而不是将整行的内容都输出。
grep "[abc]" fyydlz.txt -n -o
11、显示出文章中有多少行有a
grep “[abc]” fyydlz.txt -c
"-c"只统计匹配的行数
12、[^abc]中括号中去反
[abc]或[a-c]这样的命令, "^"符号在中括号中第一位表示排除, 就是排除字符a,b,c
注: 出现再中括号里的尖角号表示取反。
grep "[^abc]" fyydlz.txt -n
测试文件fyydlz.txt