文章目录
1 背景介绍
1.1 为什么要学习grep?
linux环境下,没有可直接操作的界面化的软件,文本怎么快速摘取出来?
怎么用通用的处理方法,而不用强依赖某个电脑或者服务器是否安装了什么软件,做到从容处理文本呢?
怎么可以快速去做linux家族的日志分析?
等等等。。。还是有必要学习。 如果这些场景你都不可能遇到或者你有其他强大的文本处理软件,可以先不用学习这个。
1.2 grep是什么?
查了下,grep是指:Global Regular Expression Print
的缩写,中文翻译:全局正则表达式打印,打印匹配给定模式的行。其输入可以是文件或者标准的输入
1.3 grep可以做什么?
grep能做的事情非常聚焦,它就是从一堆文本中按照指定的文本模式进行匹配,把匹配命中的文本行打印出来或者作为其他命令的输入进行其他操作处理。
2 grep基本语法
2.1 命令格式
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
注意1:
PATTERN 参数值格式格式’匹配内容’,注意支持基础的正则表达式,说的是基础的正则表达式,有些特殊符号是不支持的,但是基础的是支持的。
注意2:
grep匹配的时候,支持指定多个文件名。*
2.2 “PATTERN”部分中的基础型正则表达式语法学习
在基本正则表达式中,元字符 ?, +, {, |, (, 和 ) 实际使用的时候需要加上转义字符反斜杠: \?, \+, \{, \|, \(, 和 \) 。
序号 | PATTERN中内容正则字符 | 语法说明 | 用法示例 |
---|---|---|---|
1 | \* | 表示对星号前面的子表达式匹配>=0次 | grep -n ‘1\*’ ‘mytest.txt’ |
2 | \+ | 表示对加号前面的子表达式 | 匹配>=1次 |
3 | \? | 表示对问号前面的子表达式匹配0次或1次 | |
4 | \{n\} | 子表示可以用小括号包括起来,表示对修饰的子表达式匹配n次,n为非负整数 | grep -n ‘(12){2}’ ‘123.txt’ |
5 | \{n,\} | ||
6 | \{n,m\} | ||
1 | ^ | 修饰表达式的时候,放在最前面位置,表示是目标匹配的内容在行首 | |
2 | $ | 修饰时表达式的时候,放在最后的位置,表示是目标匹配的内容在行尾 | |
1 | . 这里有个英文的点,有可能看不清楚 | 代表的是一个任意字符的字符,相当于说是一个字符的占位,一定要区分,这里的点表示的含义。如果要表示点字符本身,可以结合转义字符 | grep -n ‘1.3’ ‘123.txt’ 查找包含1和3数字中间包括任意一个字符的字符串输出到界面,注意不是查询1.3这个小数。 |
2 | [list] | 查询指定的字符集合,查询的目标是这个字符集合中的其中一个字符。 | grep -n ‘1[ab]3’ ‘123.txt’ 目的是查找1a3 1b3 而不是1ab3 |
3 | [n1-n2] | 查询指定的字符范围内的其中一个字符。 | grep -n ‘1[1-3]3’ ‘123.txt’ 目的是查找113 123 133 3种场景 |
4 | [^list] | 查找的是不在字符集合或者字符范围内的行,特别注意,如果当前行数据中存在符合这个查询条件的任意字符情况的时候,当前行也会被命中,即使当前行还有其他的不符合匹配模式的字符出现。 | 假如:行数据是12345,匹配模式是[^123],那么该行还是会被命中,原因是4 5 是123范围之外的,这个角度上看属于匹配命中。 |
5 | 子表达式1|子表达式2|子表达式3 | 竖线符号,是联合多个匹配表达式 | 例如:‘aa|12’ 这个模式表示的是匹配包括aa或者12这2个字符串的行数据 |
1 | \ | 转义字符 | 比如:点.、星号*,你不希望它分别表达一个任意字符,和重复0次到多次的含义,你想它就是点和星号,那可以\. \* 这样来编写。 |
2.3 grep命令参数学习
序号 | 参数分类 | 参数 | 语法说明 | 其他补充 |
---|---|---|---|---|
1 | 基本常用 | -a,–text | 将二进制文件以文本文件来处理,相当于–binary-files=text | |
2 | 基本常用 | -c,–count | 只输出统计数据,不输出匹配的行结果,输出的s数值是按照指定模式匹配命中的行数。 | |
3 | 基本常用 | -i, --ignore-case | 忽略模式 PATTERN 中的大小写的分别。大小写在匹配的过程中不敏感。 | |
4 | 基本常用 | -n, --line-number | 在输出的每行结果的前面显示该行在文件中所处的行号。 | |
5 | 基本常用 | -v, --invert-match | 小写的v参数,匹配的目标是不符合PATTERN的行。 | |
6 | 基本常用 | –color=auto | 值可以是never,always,auto。never意思就是从不显示颜色;always意思总是显示颜色;auto,相当于于查询到的结果中查到的关键字是红色高亮,其他文本是保持原来的颜色。很多环境默认是grep效果默认是grep --color=auto,这里应该是使用alias设置过了。 | |
1 | 高级常用 | -A NUM, --after-context=NUM | 输出匹配命中的行紧接下来后面的的NUM行,如果输出这些NUM行后面还有其他非匹配命中的行,会增加一行–作为标示。请注意识别。 | |
2 | 高级常用 | -B NUM, --before-context=NUM | 输出匹配命中的行紧接前面的的NUM行,如果输出这些NUM行前面还有其他非匹配命中的行,会增加一行–作为标示。请注意识别。 | |
3 | 高级常用 | -C NUM, --context=NUM | 输出匹配命中的行紧接前面和后面的的NUM行,如果输出这些NUM行前面还有后面还有其他非匹配命中的行,会增加一行–作为标示。请注意识别。 | |
4 | 高级常用 | -o, --only-matching | show only the part of a line matching PATTERN | |
5 | 高级常用 | -R, -r, --recursive | 递归地读每一目录下的所有文件 | 注意文件太多 |
6 | 高级常用 | -l, --files-with-matches | print only names of FILEs containing matches | |
7 | 高级常用 | -L, --files-without-match | print only names of FILEs containing no match | |
8 | 高级常用 | -x, --line-regexp | 匹配的行是,完整的一行匹配命中。输出这些行。 | 等价于在模式前面增加开头和结尾符号。例如:grep -nx ‘1’ text.txt 等价于 grep -n ‘^1$’ text.txt |
9 | 高级常用 | -E, --extended-regexp | 将模式 PATTERN 作为一个扩展的正则表达式来解释 | 相当于egrep命令,这个建议后续在用grep命令达到一定的瓶颈或者不够简洁的时候,考虑学习这个方式的使用 |
1 | 命令帮助 | –help | 查询命令行的简要帮助信息 | |
2 | 命令帮助 | man grep | 详细的命令帮助信息 |
3 典型案例
3.1 匹配非空行,过滤纯空行
如果是包括空格的行,那是不会被过滤掉。
grep -nv '^$' 123.txt
3.2 匹配IPv4地址,点分10进制方式
比较方便的提取IP格式的文本的行
grep -n '\([0-9]\{3,\}\.\)\{3\}[0-9]\{3,\}' 123.txt
3.3 匹配出现”ERROR“字样的文本,大小写不敏感,前后10行显示出来
用于日志快速分析,比较有用。
grep -ni -C10 'ERROR' '123.txt'
grep -ni -A10 -B10 'ERROR' '123.txt'
3.4 查找指定包路径“com.cn.test."的行数据
grep -n 'com\.cn\.test\.' '123.txt'
3.5 查找指定字符串”delete …in…"字样的行数据,不区分大小写
这里的空格是直接输入的空格。
grep -ni 'delete .*in' '123.txt'