grep简析

Python013

grep简析,第1张

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

使用实例:

.grep 搜索字符串

命令格式:

grep string filename

寻找字串的方法很多,比如说我想找所有以M开头的行.此时必须引进pattern的观

念.以下是一些简单的例子,以及说明:

1、查找指定进程

命令:ps -ef|grep java

2、查找指定进程个数

命令:ps -ef|grep -c java

或ps -ef|grep java -c

3、从文件中读取关键词进行搜索,默认是显示的是行

例:通过管道过滤ls -l输出的内容,只显示以a开头的行。

例:显示所有以d开头的文件中包含test的行。

$ grep \'test\' d*

例:输出以hat结尾的行内容

$ cat test.txt |grep hat$

例:显示在aa,bb,cc文件中匹配test的行。

$ grep \'test\' aa bb cc

例:显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等,就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢?就将他全部写在一起,变成:[a-zA-Z0-9]。

例:显示包含ed或者at字符的内容行

cat test.txt |grep -E "ed|at"

例:如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(. ),这些字符后面紧跟着另外一个es(1),找到就显示该行。如果用egrep或grep -E,就不用""号进行转义,直接写成'w(es)t. 1'就可以了。

$ grep \'w(es)t.*1\' aa

例:显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行

grep '[a-z]\{7\}' *.txt

例:查询IP地址、邮箱、手机号

这里用到了-o和-P命令

man grep查看

也就是说-o,只显示匹配行中匹配正则表达式的那部分,-P,作为Perl正则匹配

192.168.0.1

[email protected]

匹配ABC类IP地址即 1.0.0.1---223.255.255.254

grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt

grep -E --color "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>" file.txt

邮箱是任意长度数字字母@任意长度数字字母

命令(邮箱): grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt

手机号码是1[3|4|5|8]后面接9位数字的

命令(手机号): grep -E "\<1[3|4|5|8][0-9]{9}\>" file.txt

例:任意一个字节 . 与重复字节 *

. (小数点):代表『一定有一个任意字节』的意思;

例:限定连续 RE 字符范围 {}

利用 . 与 RE 字符及 * 来配置 0 个到无限多个重复字节

打算找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义才行。

使用ps命令就可以了,格式如下:

ps -A | grep java

解释一下这个命令的意思,ps 是查看系统当前进程的命令,参数 -A(注意,是大写,linux中是区分大小写的)是显示所有程序, | 这个是管道符,用来把前面的命令结果交给后面做筛选的,grep java就是通过grep筛选命令筛选出包含java的程序。