grep 订阅
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。 [1] 展开全文
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。 [1]
信息
最新版本
3.0 [3]
原作者
Ken Thompson [2]
公开时间
1974 [4]
外文名
Globally search a Regular Expression and Print
GREP基本简介
egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。Grep命令中允许指定的串语句是一个规则表达式,这是一种允许使用某些特殊键盘字符的指定字符串的方法,这种方法中的特殊键盘字符可以用于代表其他字符也可以进一步定义模式匹配工作方式。例如:grep ".*hood" essay1。该命令将在文件essay1中搜索,显示出包含带有字符串hood的字的每一行。命令行中的点表示的是hood之前可以有任意字符,星号指的是在字符串之前点号所表示的任意字符可以有任意个(其中的双引号是可有可无的,但是当语句中包含短语或者空格时就必须加双引号)。 [5] 
收起全文
精华内容
下载资源
问答
  • grep文本过滤 千次阅读
    2021-12-20 21:33:54

    grep命令

    grep命令一般用来筛选需要的数据,文本过滤器(根据文本内容过滤文件)
    

    格式:

    grep [参数] [过滤的规则] [操作对象]
    
    标准输出 | grep [参数] [过滤规则]
    

    grep命令的参数

    参数:
        -n  :显示过滤出来的文本在文件当中的行号
        -o  : 只显示匹配到的内容
        -q  : 静默输出(一般用来shell脚本当中)
        -i  : 忽略大小写
        -c  : 显示匹配到的行数
        -v  : 反向查找
        -w  : 匹配某个词
        -E  : 使用扩展正则
        -R|-r  :递归查询
        -l  : 匹配成功之后,将文本的名称只打印文件路径
    
    拓展参数 :(了解)
        -A  : 显示匹配到的数据的后几n行
        -B  :显示匹配到的数据的前几n行
        -C  :显示匹配到的数据的前后各几n行
        
    知识储备:
        $?  : 代表上一条命令执行是否成功
            (0 :成功,非0代表失败)
        词  : 一连串字母和数字组成的字符串   与-w搭配
        wc  :  匹配行数
    		-l : 打印匹配行数
    		-c : 打印匹配的字节数
    
        案例1 :要过过滤出/etc/passwd 中包含的root的行及其行号
            grep -n "root" /etc/passwd
            
        案例2 : 要求过滤出/etc/passwd 中包含的root的行,只显示过滤到的内容
            grep -o "root" /etc/passwd
            
        案例3 :要求过滤/etc/passwd 中的Root,忽略大小写
            grep -i 'Root' /etc/passwd
            
        案例4 :要求匹配mail及其后两行
            grep -n -A 2 "mail" /etc/passwd
            
        案例5 :要求匹配mail及其前两行
            grep -n -B 2 "mail" /etc/passwd
            
        案例6 :要求匹配mail及其前后各两行
            grep -n -C 2 "mail" /etc/passwd
            
        案例7 :要求显示包含root有多少行
            grep "root" /etc/passwd
            grep -c "root" /etc/passwd # 2
            
        案例8 :要求查询不包含root的行
            grep -v "root" /etc/passwd
            
        案例9 : 匹配词
            grep -w '词' 1.txt
        
        案例10 :要求匹配出包含 词 的行
            grep -E "(词)+" 1.txt
            
        案例11 :要求找出/etc目录下,那些文件中包含root
            grep -R "root" /etc/
        只打印文件路径
            grep -Rl "root" /etc/ 
    
    练习
        1.计算/etc目录下包含root的文件有多少个?
            grep -R -l "root" /etc/|wc -l
            
        2.查询/etc/passwd文件中包含/bin/bash的行并输出行号
            grep -n "/bin/bash" /etc/passwd
            
        3.过滤出当前主机包含的ip
            ip -a|grep -o -E "([0-9]{1,3}\.){3}([0-9]){1,3}"
    

    正则表达式

    正则表达式是通过包含特殊含义的一些字符去适配各种匹配一类字符串的公式场景。
    

    普通正则表达式

    *       :匹配零个或多个前导字符
    $       :以 前导字符结尾
    .       :匹配任意一个字符且只有一个字符(换行符除外)
    ^       : 以指定字符开头的行
    [^]     : 取反,排除括号中信息的。(不好含)
    .*      : 所有字符的任何个数(包含空行)
    []      : 或者(其中包含所有的字符)
    ^$      : 过滤空行
    \       : 转义字符(让其他原本有特殊含义的字符变的没有含义)还原字符的本来意思
    
    [a-z]   : a-z所有的一个字母
    [A-Z]   : A-Z所有的一个字母
    [0-9]   : 0-9所有的一个字母
    
    ^.*xxxx     : 表示以开头到什么字符为止的内容(贪婪匹配)
    ^xxx.*xxxx$ : 表示以什么开头,并且以什么结尾的信息进行匹配出来
    
    \.$     :表示查询出以点结尾的行
    \n\r    : 表示匹配一个换行符号
    \t      : 表示匹配一个制表符号
    
        例1 :匹配包含22的行
            grep "222?" 1.txt
        1111122223333
        22223333 		.*
        2222    		2*
        222             2?
        
        例2 :以3结尾的行
            grep -E "33$" 1.txt
            
        例3 :要求输出包含eth的行
            grep "eth." 2.txt
        
        例4 :以1开头的行
            grep "^1" 1.txt
            
        例5 :要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
            grep "^[^#]" /etc/nginx/nginx.conf
            
        例6 :要求匹配出2后面有任意数量的任意字符
            grep "2." 1.txt
            
        例7 :要求匹配出本机中所有的普通用户
            grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
    

    扩展正则表达式(grep必须加-E参数,或者使用egrep命令)

    egrep 等价于  grep -E
    
    +       : 前导字符的一个或多个   与-E用
    
    补充总结 :一般加号符号经常是与中括号使用,可以匹配出多个不同的连续字符
    
    ?      :前导字符的零个或一个
    |       :或者 (竖线两边的字符)
    ()    :分组,组成一个过滤指定整体
        \n  : n 代表的是前面第几个分组
    {m,n}   : 范围,至少有m个,最多有n个
        {m} : 范围,固定m 个
        {m,}: 范围,至少有m个
        {}  : 表示定义前面字符出现次数
        {,n}: 匹配最多n次
    

    正则符号注意事项 :

    1. 按照每行信息进行过滤处理
    2. 注意正则表达符号禁止中文
    3. 附上颜色信息进行正则过滤
        --color=auto/--color
    
        例1 :匹配一个或多个2
            egrep "2+" 1.txt
            egrep "22*" 1.txt
            egrep "2{1,}" 1.txt
            
        例2 :查询出3个2
            egrep "2{3}" 1.txt
            
        例3 :查询出包含22或者33的行
            egrep "22|33" 1.txt
            
        例4 :匹配出包含12341234的行
            grep "12341234" 1.txt
            grep -E "(1234){2}" 1.txt
            grep -E "(1234)\1" 1.txt
            
        例5 :要求匹配出包含1234abcd1234abcd的行
            grep "1234abcd1234abcd" 1.txt
            grep -E "(1234)(abcd)\1\2" 1.txt
    
    练习
        将/etc/fstab文件中所有的注释行和空行过滤掉
    		[root@localhost tmp]# egrep -v "^$|^#" /etc/fstab
    		[root@localhost tmp]# egrep "^[^#]" /etc/fstab
        [root@localhost ~]# grep -vE "^ *#|^$" /etc/fstab
    
    练习
        1. 过滤出当前系统IP
            ip a |grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
            
        2. 过滤出手机号
            echo "18712345678" |grep -E "(155|187|136|166|177|138)[0-9]{8}"
            
        3. 过滤出邮箱
            echo "123456@qq.com" |grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
            
        4、将/etc目录下所有的普通文件打包压缩至/tmp目录
    	[root@localhost tmp]# tar -czPf /tmp/etc.tar.gz $(find /etc/ -type f | xargs )
    
        5、将etc下包含root的文件打包压缩到/tmp目录下
    	[root@localhost tmp]# tar -czPf /tmp/grep.tar.gz $(grep -R -l "root" /etc/ | xargs )    
    
    更多相关内容
  • linux grep 命令的详情解释 给初级者
  • grep用来过滤字符串信息,grep默认对字母大小写敏感,不过可以通过选项对grep屏蔽大小写敏感,该选项为 -i。 一、查看grep工具版本方法 图1 grep版本查询 二、grep -i 使用方法 图2 grep不区分大小写 备注: grep...
  • grep命令 知识简介 grep 命令用于查找内容包含指定模式的文件,如果发现某文件的内容符合所指定的模式样式,预设 grep 指令会把含有模式样式的那一列显示出来。 grep家族包括grep、egrep和fgrep。egrep和fgrep的命令...
  • 大部分人在写Shell 过滤进程的时候 都会使用 grep 在 ps aux 的输出结果中查找指定的进程,但此时也会把 grep 进程也显示出来 比如查找 pptpd 进程,会匹配出来两条: 代码如下: [root@selboo ~]# ps aux | grep ...
  • 格列普 使用Java实现Grep CLI功能
  • Linux系统中搜索、查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索。下面来一起看看Linux利用grep命令检索文件内容的详细介绍。 方法如下: 1、搜索某个文件里面是否...
  • 主要介绍了Linux 使用grep筛选多个条件及grep常用过滤命令,需要的朋友可以参考下
  • grep -A 10 关键字 file名 –>显示file文件里匹配”关键字”那行及后10行 示例:grep -A 10 “err” log-file.log ②grep -B 10 关键字 file名 –>显示file文件里匹配”关键字”那行及前10行 示例:grep -B 10 ...
  • grep插件将grep之类的实用程序(grep,fgrep,egrep,agrep,findstr,silver searcher(ag),ripgrep,ack,git grep,sift,platinum searcher和通用代码grep)集成在一起,并允许您搜索模式在一个或多个文件中...
  • grep、cut

    2021-01-07 05:56:28
    grep 行过滤工具 grep [选项] ‘关键字’ 文件名 grep -rn “xxx” filename -n 显示行号 -i 不区分大小写 -v 取反 -r 遍历目录查找 grep -n ‘^root’ filename //root开头 grep -n ‘root$’ filename //root结尾 ...
  • 主要介绍了linux 中grep 匹配制表符 和 换行符的命令,需要的朋友可以参考下
  • grep -S "searchtext" *.txt grep -S "searchtext" \personal\files\*.txt grep -S searchtext C:\*.* dir *.* /sub | grep -i DLL | more 原文链接:http://www.interlog.com/~tcharron/grep.html
  • windows可用的grep工具,把文件目录添加搭配path环境变量即可,使用方法如下: grep -S "searchtext" *.txt grep -S "searchtext" \personal\files\*.txt grep -S searchtext C:\*.* -S是搜索子目录,没有就是搜索...
  • windows下类似grep的小工具,能搜索指定目录下所有文件中的字符串,绿色版
  • 解压后复制到c:\windows目录, 进入命令行dir | grep keywords, 用法同linux。win10下测试好用。
  • windows下的grep命令,解压缩后将grep.exe放在C:\Windows下即可使用,或者手动将grep.exe所在的路径加入到PATH环境变量中也可以
  • windows grep包 解压后,grep路径加入PATH,即可使用 D:\>grep Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.
  • windows grep 软件

    2018-10-17 16:15:30
    windows 版本 grep 搜索过滤软件,强大到跟linux下面grep一样
  • Linux三剑客awk sed grep全攻略
  • unite-grep-vcs 版本:0.1.0支持:Vim 7.3及更高版本(让我知道是否存在问题) 注意grep/git来源现在被移到了从承诺。 unite-grep-vcs是'git grep'或'hg grep'的源软件包插件。 有一个类似的名为插件。 和不同的...
  • grep命令详解

    千次阅读 2021-05-10 04:59:59
    如果你是一个新手,请从头阅读这篇文章,如果你只是忘记了grep命令的一些常用选项,直接查看文章尾部的总结部分即可。先说说grep命令能做什么?我们可以使用grep命令在文本中查找指定的字符串,就像你在windows中...

    如果你是一个新手,请从头阅读这篇文章,如果你只是忘记了grep命令的一些常用选项,直接查看文章尾部的总结部分即可。

    先说说grep命令能做什么?

    我们可以使用grep命令在文本中查找指定的字符串,就像你在windows中打开txt文件,使用快捷键 “Ctrl+F” 在文本中查找某个字符串一样,说白了,可以把grep理解成字符查找工具。

    grep是Linux中最常用的”文本处理工具”之一,grep与sed、awk合称为Linux中的三剑客。

    grep的全称为: Global search Regular Expression and Print out the line

    全称中的”Global search”为全局搜索之意。

    全称中的”Regular Expression”表示正则表达式。

    所以,从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。

    当然,不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。

    我们先来看一个最简单的使用示例,从最简单的示例开始认识grep。

    为了实验方便,我们先准备一个测试文件,文件名为testgrep,文件内容如下。

    ab878860b3c8d3e7e2f993b5c38c9256.png

    假设,现在我们想要从testgrep文本文件中搜索包含”test”字符串的行,则可以使用如下命令

    25ef2de3e810d7c3ba7d35c60580c6dd.png

    上图中的命令表示使用grep命令,在testgrep文件中搜索包含”test”字符串的行,并将包含test字符串的行打印出来。

    于是,testgrep文件中的第一行被打印了出来,默认情况下,grep是区分大小写的,所以,文件中包含大写”TEST”的行没有被打印出来。

    grep的使用是不是很简单,我们继续聊。

    如果我们想要在搜索字符串的时候,不区分大小写,应该怎样做呢?grep很贴心,为我们准备了一个选项,使用”-i”选项,即可在搜索时不区分大小写,示例如下:

    739a38896cbdc3f37ffb2910575cfce4.png

    如上图所示,在不区分大小写的情况下,由于testgrep文本中的第一行与第五行中都包含”test”,所以,这两行都被打印了出来。

    由于testgrep文本中的内容不较少、行比较少,所以,我们能数过来,是第一行与第五行包含”test”字符,如果文本中有1000行,我们还想要知道哪行文本包含”test”字符串,则可以使用”-n”选项,表示显示打印出的行在文本中的行号,示例如下。

    c49bcb3de27f4156e527d4c68e9445a8.png

    如上图所示,grep不仅将符合条件的行输出了,同时还显示了行号,证明testgrep文本中的第1行与第5行,在不区分大小写的情况下,都包含字符串”test”。

    在centos6中,我们使用grep在文本中搜索出的行虽然会被打印了出来,但是在打印这些行时,被匹配到的关键字没有高亮显示,如果我们想要高亮显示行中的关键字,该怎么办呢?我们可以使用”–color”选项,高亮显示行中的关键字,示例如下

    注:”–color选项”是长选项

    4bec1fa4d319ee5bad22764ebd4a878f.png

    使用”–color”与使用”–color=auto”的效果相同,都表示高亮显示关键字,我比较懒,习惯使用”–color”。

    在centos7中,系统默认为grep命令配置了别名,所以在centos7中使用grep命令时,不用显式的指定”–color”选项,默认就会高亮显示被匹配到的关键字,在centos7中使用alias命令,即可查看到grep命令的别名,如下

    bdc0c5758a16bff9cdda4844dde65081.png

    可以看到,centos7中为grep命令配置的别名中,默认包含了–color选项,所以,不用显示指定,也可高亮显示。

    所以,我们也可以在centos6中借鉴这种方法。

    41849b333df33665fa8d19e527192da7.png

    上图中,testgrep文本中一共有两行包含”test”字符串,如果我们只想知道有多少行包含指定的字符串,而不在乎哪些行包含这些字符串,我们可以使用如下命令,获取到符合条件的总行数。

    19425ca1ee080d1007588f5e92fc3613.png

    没错,使用”-c”选项即可只统计符合条件的总行数,而不会打印出行。

    之前的示例中,包含关键词的行都会被打印出来,整行都会被打印出来,如果我们只想看被匹配到的关键字,不想整行都被打印出来,可以吗?必须的,使用”-o”选项即可只打印出匹配到的关机字,而不打印出整行,示例如下。

    a46ca8c7d3ea759950a4bfe1e0158a74.png

    如上图所示,使用”-o”选项,可以只显示被匹配到的关键字,而不是讲整行的内容都输出。

    但是需要注意,”-o”选项会把每个匹配到的关键字都单独显示在一行中进行输出,什么意思呢?看如下示例即可明白。

    e347351c936a62d279039961b7f0d58c.png

    如上图所示,当没有使用”-o”选项时,包含”123″字符串的行都会被打印出来,当同一行中包含多个”123″时,所在行会被打印出来,对应的关键字也会高亮显示,当使用了”-o”选项时,每个被匹配到的关键字都会被单独打印在一行中,如上图所示,第三个”123″与第四个”123″都属于第10行的文本,但是它们仍然各自独占一行的输出了。

    其实,我们在使用grep命令搜索文本时,往往有这种需求:在找到对应的关键字时,同时需要显示关键字附近的信息,什么意思呢?

    我们来看一个场景,就能明白,我们新建了一个测试文件:testgrep1,测试文件内容如下

    a0ff3b6c97b3fc27b81c7d412db5edd3.png

    假设,我们想从testgrep1文件中找出”年龄为18″的人,我们该怎么找呢?你可能会尝试使用如下命令。

    1fb8af01ef78369aa997b533dbfe8467.png

    如上图所示,我们是匹配到了”年龄:18″的行,但是我们并不能从结果中得知年龄为18的人的姓名,因为姓名与年龄并不在一行中,那么我们该怎么办呢?

    我们可以使用”-B”选项,显示符合条件的行之前的行,”B”有before之意,示例如下

    16003eaa2a96ba6a50cd9de939ae6468.png

    如上图所示,包含字符串”年龄:18″的行被高亮输出了,同时,符合条件的行”之前的一行”也被打印了出来,这时,我们就能从结果中得知,朱双印今年18岁,王尼美今年18岁。

    没错,上例中的”-B1″选项表示显示符合条件的行的同时还显示之前的1行,举一反三,”-B5″代表同时显示之前的5行,”-B3″代表同时显示之前的3行,”-B”选项的后面必须有数字,否则会报错。

    与”-B”选项对应的选项是”-A”选项,”-B”有Before之意,”-A”有After之意,聪明如你,一定已经猜到了”-A”的含义,没错,”-A”代表显示符合条件的行的同时,还要显示之后的行,”-A3″表示同时显示符合条件的行之后的3行,我就不再赘述了。

    说了”-A”,说了”-B”,现在说说”-C”,”-C”选项可以理解为”-A与-B”的结合,”-C”选项表示在显示符合条件的行的同时,也会显示其前后的行,如”-C1″,”-C1″表示打印符合条件的行的同时,也打印出之前的一行与之后的一行,”-C”有Context之意(上下文之意),示例如下。

    5dc271328045bdd65a2097d84a859758.png

    这样我们就能看到”年龄是18岁”的人的所有信息了。

    有的时候,我们往往需要进行所谓的”精确匹配”,但是使用之前的方法似乎无法满足我们,示例如下。

    3789b3698fdd8b85ec91d2d25ba9ba36.png

    上图中,当我们在文本中搜索”zsy”字符串的时候,”zsy”、”zsythink”、”123zsy123″所在的行都被匹配到了,因为”zsythink”中也包含了”zsy”,所以也被匹配到了,但是当我们想要”精确匹配”zsy字符串的时候,按照上例中的方法就无法做到了,所谓的精确匹配,就是”zsy”作为一个独立的单词存在,而不是包含于某个字符串中,那么,如果有这种需求,我们怎么办呢?使用”-w”选项可以实现我们的需求,示例如下。

    34998d5f53ad4b029393ee9b3ab85bde.png

    如上图所示,只有”zsy”作为一个独立的单词存在的时候,才会被匹配到,”zsy”包含于某个字符串的时候,则不会被匹配到,这就是所谓的精确匹配,”-w”有word之意,表示搜索的字符串作为一个独立的单词时才会被匹配到。

    有的时候,我们需要反向查找,比如,查找”不包含某个字符串”的行,这个时候,我们需要用到”-v”选项,示例如下。

    a868732cabc4d1657645628e1ae73147.png

    上例表示查找出文本中不包含”zsy”字符串的行。

    某些场景下,我们可能想要同时从多个目标中匹配,什么意思呢?看了示例就秒懂,示例如下。

    47cfa5899f5c227966096d8f83463cb6.png

    上例中,我们同时在文本中搜索了”abc”字符串与”test”字符串,包含这两个字符串中任意一个的行都会被打印出来,没错,就像上图中的示例一样,使用”-e”选项可以同时匹配多个目标,多个目标之间存在”或”关系,即匹配其中的任意一个都算作匹配成功。

    在写脚本时,你可能只是想要利用grep判断文本中是否存在某个字符串,你只关心有没有匹配到,而不关心匹配到的内容,你只关心有,或者没有,这时,我们可以使用grep的静默模式,示例如下。

    12575150f77b772564af787b478ecf1b.png

    当使用”-q”选项时,表示grep使用静默模式,静默模式下grep不会输入任何信息,无论是否匹配到指定的字符串,都不会输出任何信息,所以,我们需要配合”echo $?”命令,查看命令的执行状态,如果返回值为0,证明上一条grep命令匹配到了指定的字符串,如果返回值为1,则证明上一条grep命令没有匹配到指定的字符串,就像上图示例中显示的那样,静默模式下,grep没有输出任何信息,当我们在testgrep文本中查找”test”字符串时,可以匹配到结果,当在文本中查找”ttttttttttttt”字符串的时候,没有匹配到结果,所以,我们只关心有没有匹配到指定字符时,可以使用”-q”选项,但是需要配合”echo $?”命令查看执行状态。

    注:如果你对正则表达式还不熟悉,可以先跳过下面的示例,本博客中会对”正则表达式”进行详细总结。

    正则表达式系列文章直达链接:正则表达式详解

    文章开头说了,grep可以利用正则表达式进行搜索,但是之前的举例中,grep都没有使用正则表达式,只是纯粹的去查找一些字符串,这次,我们使用grep命令,配合正则表达式,来查找我们想要的目标。

    比如,我们想要查找某个文本中的合法邮箱,示例如下

    c233d75f5cb4140bc5077432fd473b02.png

    眼尖的你肯定发现了,上图中的正则表达式为扩展正则表达式,而不是基础正则表达式,所以,在上述命令中,我使用了”-E”选项。

    在使用”-E”选项时,grep才支持”扩展正则表达式”,不使用”-E”选项时,grep默认只支持”基本正则表达式”。

    不同的开发语言中,正则表达式的规则可能略有不同,我们在使用grep时,可以使用”-P”选项,指明使用perl兼容的正则表达式。

    示例如下:

    fd4a3edd81edad0065928d4ae8660ca0.png

    好了,grep的常用选项我们已经总结完毕,剩下需要做的就是不断的练习了。

    其实,除了grep命令,其实还有egrep命令,还有fgrep命令(fast grep),它们有各自的特点。

    grep:支持基本正则表达式

    egrep:支持扩展正则表达式,相当于grep -E

    fgrep:不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高,fastgrep

    总结

    为了方便以后回顾,将grep的常用选项总结如下

    –color=auto 或者 –color:表示对匹配到的文本着色显示

    -i:在搜索的时候忽略大小写

    -n:显示结果所在行号

    -c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数

    -o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行

    -v:输出不带关键字的行(反向查询,反向匹配)

    -w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配

    -Ax:在输出的时候包含结果所在行之后的指定行数,这里指之后的x行,A:after

    -Bx:在输出的时候包含结果所在行之前的指定行数,这里指之前的x行,B:before

    -Cx:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行,C:context

    -e:实现多个选项的匹配,逻辑or关系

    -q:静默模式,不输出任何信息,当我们只关心有没有匹配到,却不关心匹配到什么内容时,我们可以使用此命令,然后,使用”echo $?”查看是否匹配到,0表示匹配到,1表示没有匹配到。

    -P:表示使用兼容perl的正则引擎。

    -E:使用扩展正则表达式,而不是基本正则表达式,在使用”-E”选项时,相当于使用egrep。

    希望这篇文章能对你有所帮助~~~客官常来捧场哦,么么哒~~~~~

    展开全文
  • Linux之grep命令详解

    千次阅读 2022-02-18 17:04:15
    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 二、grep常用用法 1、...

    注: 部分概念介绍来源于网络

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

    二、grep常用用法
    1、grep [-acinv] [--color=auto] '搜寻字符串' filename.txt
    选项与参数:
    -w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
    -q : 静默模式,没有任何输出,得用$?(echo $?)来判断执行成功没有,即有没有过滤到想要的内容
    -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
    -A n : 如果匹配成功,则将匹配行及其后n行一起打印出来
    -B n : 如果匹配成功,则将匹配行及其前n行一起打印出来
    -C n :如果匹配成功,则将匹配行及其(前后)n行一起打印出来
    -E :等同于egrep,支持扩展的正则表达式;
    -F :--fixed-strings:支持使用固定字符串,不支持正则表达式,相当于fgrep;
    -G :--basic-regexp:支持使用基本正则表达式;
    -P :--perl-regexp:支持使用pcre正则表达式;
    -o : 只显示匹配的内容
    -a :将 binary 文件以 text 文件的方式搜寻数据
    -c :计算找到 '搜寻字符串' 的次数,注意如果同时使用-cv选项是显示有多少行没有被匹配到
    -i :忽略大小写的不同,所以大小写视为相同
    -n :顺便输出行号
    -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
    -R :搜索子目录
    --color=auto :可以将找到的关键词部分加上颜色的显示喔!
    在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。 这可是个很不错的功能啊!但是如果每次使用 grep 都得要自行加上 --color=auto 又显的很麻烦~ 此时那个好用的 alias 就得来处理一下啦!你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦

    2、以 grep 找出内含 aaa 那行,在关键字所在行的前两行与后三行也一起显示出来
    cat filename.txt | grep -n -A2 -B1 --color=auto 'aaa'
    1-bbb
    2:aaa
    3:aaa
    4-ccc
    5-ccc
    # 如上所示,你会发现关键字 2 所在的前一行及 3 所在后二行也都被显示出来!

    3、根据文件内容递归查找目录
    # grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件
    # grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件
    # grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件

    三、grep与正规表达式
    ^    行首 grep '^how' => how行首
    $    行尾 grep 'name$' => name行尾
    .    除了换行符以外的任意单个字符 grep 'n..e' => name
    *    前导字符的零个或多个 grep 'x*y' => y,xy,xxy
    .*    所有字符 grep 'n.*e' => naaame
    []    字符组内的任一字符 grep 'm[a-z]' => my
    [^]    对字符组内的每个字符取反(不匹配字符组内的每个字符) grep '[^b-z]re' => are
    ^[^]    非字符组内的字符开头的行
    [a-z]    小写字母
    [A-Z]    大写字母
    [a-Z]    小写和大写字母
    [0-9]    数字
    [[:alpha:]]    任何字母
    [[:digit:]]    任何数字
    [[:alnum:]]    任何字母和数字
    [[:upper:]]    任何大写字母
    [[:lower:]]    任何小写字母
    [[:punct:]]    任何标点符号
    [[:xdigit:]]    任何16进制的数字,相当于[0-9a-fA-F]
    [:blank:]    空白字符(空格和制表符)
    [:space:]    包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白
    [:cntrl:]    不可打印的控制字符(退格、删除、警铃...)
    [:graph:]    可打印的非空白字符
    [:print:]    可打印字符
    \< 或 \b    词首锚定,用于单词模式的左侧 grep '\<a' => are
    \> 或 \b    词尾锚定,用于单词模式的右侧 grep 'e/>' => name
    ?    前导字符零个或一个最多一个 grep 'x\?y' => y,xy
    +    前导字符至少一个或多个 grep 'x\+y' => xy,xxy 
    x{m}    x出现m次 grep 'x\{2\}y' => xxy,xxxy
    x{m,}    x出现m次至多次(至少m次) grep 'x\{2,\}y' => xxy,xxxy
    x{m,n}    x出现m次至n次 grep 'x\{2,4\}y' => xxy,xxxy,xxxxy
    x{0,n}    x出现至多n次 grep 'x\{0,2\}y' => y,xy,xxy
    abc|def    表示abc或def
    a(bc|de)f    表示abcf 或 adef
    扩展正则    grep -E 或 egrep
    ^$    空白行
    ^[[:space:]]*$    空行或包含空白字符的行;
    匹配完整单词    grep '\<n.*e\>' => name
    ()    一个整体
    |    表示匹配符号两边的任意一边,比如a|b,表示匹配a或者b
    \b    匹配一个单词边界,也就是指单词和空格间的位置。
    \B    匹配非单词边界。
    \cx    匹配由x指明的控制字符。
    \d    匹配一个数字字符。等价于 [0-9]。
    \D    匹配一个非数字字符。等价于 [^0-9]。
    \f    匹配一个换页符。等价于 \x0c 和 \cL。
    \n    匹配一个换行符。等价于 \x0a 和 \cJ。
    \r    匹配一个回车符。等价于 \x0d 和 \cM。
    \s    匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
    \S    匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    \t    匹配一个制表符。等价于 \x09 和 \cI。
    \v    匹配一个垂直制表符。等价于 \x0b 和 \cK。
    \w    匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
    \W    匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。
    \xn    匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
    \num    匹配 num,其中num是一个正整数。对所获取的匹配的引用。
    \n    标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
    \nm    标识一个八进制转义值或一个后向引用。
        如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。
        如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。
        如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
    \nml    如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
    \un    匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。
    以一个可选的负号 ([-]?) 开头 (^)、跟着1个或更多的数字([0-9]+)、和一个小数点(\.)再跟上1个或多个数字([0-9]+),并且后面没有其他任何东西($)
    特殊字符 ? 与 {0,1} 是相等的,它们都代表着: 0个或1个前面的内容 或 前面的内容是可选的 。所以刚才的例子可以简化为:
    ^\-?[0-9]{1,}\.?[0-9]{1,}$
    特殊字符 * 与 {0,} 是相等的,它们都代表着 0 个或多个前面的内容 
    字符 + 与 {1,} 是相等的,表示 1 个或多个前面的内容 

    1、字符类
    1.1、字符类的搜索:如果想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在这个时候,我可以这样来搜寻:
    grep -n 't[ae]st' filename.txt
    其实 [] 里面不论有几个字节,他都谨代表某『一个』字节, 所以,上面的例子说明了,我需要的字串是『tast』或『test』两个字串而已!

    1.2、字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下
    grep -n '[^g]oo' filename.txt

    1.3、字符类的连续:假设我 oo 前面不想要有小写字节,所以,我可以这样写 [^abcd....z]oo ,但是这样似乎不怎么方便,由於小写字节的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下这样:
    grep -n '[^a-z]oo' filename.txt
    也就是说,当我们在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢? 呵呵!就将他全部写在一起,变成:[a-zA-Z0-9]。
    我们要取得有数字的那一行,就这样:
    grep -n '[0-9]' filename.txt

    2、行首与行尾字节 ^ $
    2.1、行首字符:如果我想要让 the 只在行首列出呢? 这个时候就得要使用定位字节了:
    grep -n '^the' filename.txt
    如果我想要开头是小写字节的那一行就列出呢:
    grep -n '^[a-z]' filename.txt
    如果我不想要开头是英文字母,则可以是这样:
    grep -n '^[^a-zA-Z]' filename.txt
    ^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
    那如果我想要找出来,行尾结束为小数点 (.) 的那一行:
    grep -n '\.$' filename.txt
    特别注意到,因为小数点具有其他意义,所以必须要使用转义字符(\)来加以解除其特殊意义!

    2.2、找出空白行:
    grep -n '^$' filename.txt
    因为只有行首跟行尾 (^$),所以,这样就可以找出空白行啦!

    3、任意一个字节 . 与重复字节 *
    这两个符号在正则表达式的意义如下:
    . (小数点):代表『一定有一个任意字节』的意思;
    * (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态
    假设我需要找出 g??d 的字串,亦即共有四个字节, 起头是 g 而结束是 d ,我可以这样做:
    grep -n 'g..d' filename.txt
    如果我想要列出有 oo, ooo, oooo 等等的数据, 也就是说,至少要有两个(含) o 以上,该如何是好?
    因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有空字节或一个 o 以上的字节』,因此,『 grep -n 'o*' filename.txt 』将会把所有的数据都列印出来终端上!
    当我们需要『至少两个 o 以上的字串』时,就需要 ooo* ,亦即是:
    grep -n 'ooo*' filename.txt
    如果我想要字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等,那该如何?
    grep -n 'goo*g' filename.txt
    如果我想要找出 g 开头与 g 结尾的行,当中的字符可有可无
    grep -n 'g.*g' filename.txt
    因为是代表 g 开头与 g 结尾,中间任意字节均可接受,所以这个 .* 的 RE 表示任意字符是很常见的.
    如果我想要找出『任意数字』的行?因为仅有数字,所以就成为:
    grep -n '[0-9][0-9]*' filename.txt

    4、限定连续 RE 字符范围 {}
    我们可以利用 . 与 RE 字符及 * 来配置 0 个到无限多个重复字节,那如果我想要限制一个范围区间内的重复字节数呢?
    举例来说,我想要找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义才行。至於 {} 的语法是这样的,假设我要找到两个 o 的字串,可以是:
    grep -n 'o\{2\}' filename.txt
    假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串,他会是这样:
    grep -n 'go\{2,5\}g' filename.txt
    如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:
    grep -n 'go\{2,\}g' filename.txt

    四、扩展grep(grep -E 或者 egrep):
    使用扩展grep的主要好处是增加了额外的正则表达式元字符集。
    打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。
    egrep 'NW|EA' filename.txt     
    对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。
    grep 'NW\|EA' filename.txt
    搜索所有包含一个或多个3的行。
    egrep '3+' filename.txt
    grep -E '3+' filename.txt
    grep '3\+' filename.txt        
    搜索所有包含0个或1个小数点字符的行。
    egrep '2\.?[0-9]' filename.txt 
    grep -E '2\.?[0-9]' filename.txt
    grep '2\.\?[0-9]' filename.txt 
    #首先含有2字符,其后紧跟着0个或1个点,后面再是0和9之间的数字。
    搜索一个或者多个连续的no的行。
    # egrep '(no)+' filename.txt
    # grep -E '(no)+' filename.txt
    # grep '\(no\)\+' filename.txt   
    grep -E '(ab)*' filename.txt
    1:abababc


    五、grep查找文件内容单双引号用法的区别
    5.1、单引号:全引用。shell命令不做转义处理。
    5.2、双引号:部分引用。shell命令会做转义处理。优先解析命令和变量。
    5.3、不加引号:效果等同于双引号的作用,优先解析命令和变量。

    六、需要转义的特殊字符:\,$等
    6.1、查找特殊字符\
    grep '\\' test.log  
    # 单引号全引用,shell不做转义处理;\\———shell——\\——grep——\——>查找 
    # \\ shell不做转义处理传递给grep,grep做转义处理为\,拿去查找\字符
    grep "\\\\" test.log 
    # 双引号部分引用,shell做特殊字符的转义处理;\\\\———shell——\\——grep——\——>查找 
    # \\\\ shell做转义处理为\\传递给grep,grep做转义处理为\,拿去查找\字符
    6.2、查找$字符
    grep '\$' test.log  
    # 单引号全引用,shell不做转义处理;
    # \$ shell不做转义处理传递给grep,grep做转义处理为$,拿去查找$字符
    grep "\\$" test.log 
    # 双引号部分引用,shell做特殊字符的转义处理;
    # \\$ shell做转义处理为\$传递给grep,grep做转义处理为$,拿去查找$字符
     
    七、查找单双引号:
    7.1、查找单引号'name'
    grep "'name'" test.log
    如果用单引号方式去查找,无论外面嵌套多少层单引号,都只能匹配出name,而不是'name'
    7.2、查找双引号"age"
    grep '"age"' test.log
    如果用双引号方式去查找,无论外面嵌套多少层双引号,都只能匹配出age,而不是"age"
    对于单双引号同时存在需要匹配的情况下,比较简单粗暴的处理方式就是用单引号方式查找,查找字符里的单双引号均用.(点号)去匹配。
    grep '.name.' test.log
    grep '.age.' test.log


    八、grep命令的-P选项
    -P, --perl-regexp
    -P 可以让grep使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。
    最典型的用法是,匹配指定字符串之间的字符。比如,我们想在一句话(Hello,my name is aming.)中匹配中间的一段字符串(my name is) 可以这样写正则表达式。 
    echo "Hello, my name is aming."|grep -P '(?<=Hello, ).*(?= aming.)'
    如果只需要匹配到的部分,还可以加上-o选项
    echo "Hello, my name is aming."|grep -Po '(?<=Hello, ).*(?= aming.)'
    根据这个思路,我们可以去匹配IP地址
    ifconfig eth0 |grep -Po '(?<=addr:).*(?= Bcast)'


    九、示例
    9.1、字母开头,包含字母数字下划线,长度小于20:
    ^[a-zA-Z][a-zA-Z0-9_]{1,19}$
    9.2、字母开头,数字结尾,最长20,使用 ?=.{1,20}$ 固定总长度
    ^(?=.{1,20}$)[a-zA-Z][a-zA-Z_]{0,19}[0-9_]{0,19}$
     

    展开全文
  • grep-2.5.4-setup windows的grep最新版,安装后可在windows操作系统上像在linux上使用grep命令。
  • Linux之grep命令

    千次阅读 2022-01-25 12:23:58
    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定...

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。

    命令格式

    grep [options] [pattern] [file ...]

    命令功能

    用于过滤/搜索的特定字符

    options

    • -a --text # 不要忽略二进制数据。
    • -A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
    • -b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
    • -B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
    • -c --count # 计算符合范本样式的列数。
    • -C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
    • -d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
    • -e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
    • -E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
    • -f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
    • -F --fixed-regexp # 将范本样式视为固定字符串的列表。
    • -G --basic-regexp # 将范本样式视为普通的表示法来使用。
    • -h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
    • -H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
    • -i --ignore-case # 忽略字符大小写的差别。
    • -l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
    • -L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
    • -n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
    • -P --perl-regexp # PATTERN 是一个 Perl 正则表达式
    • -q --quiet或–silent # 不显示任何信息。
    • -R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
    • -s --no-messages # 不显示错误信息。
    • -v --revert-match # 反转查找。
    • -V --version # 显示版本信息。
    • -w --word-regexp # 只显示全字符合的列。
    • -x --line-regexp # 只显示全列符合的列。
    • -y # 此参数效果跟“-i”相同。
    • -o # 只输出文件中匹配到的部分。
    • -m --max-count= # 找到num行结果后停止查找,用来限制匹配行数

    pattern

    • ^ # 锚定行的开始 如:’^grep’匹配所有以grep开头的行。
    • $ # 锚定行的结束 如:‘grep$’ 匹配所有以grep结尾的行。
    • . # 匹配一个非换行符的字符 如:'gr.p’匹配gr后接一个任意字符,然后是p。
    • * # 匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。
    • .* # 一起用代表任意字符。
    • [] # 匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。
    • [^] # 匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
    • \(..\) # 标记匹配字符,如’(love)’,love被标记为1。
    • \< # 锚定单词的开始,如:’` # 锚定单词的结束,如’grep>'匹配包含以grep结尾的单词的行。
    • x\{m\} # 重复字符x,m次,如:'0{5}'匹配包含5个o的行。
    • x\{m,\} # 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
    • x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5–10个o的行。
    • \w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
    • \W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
    • \b # 单词锁定符,如: '\bgrep\b’只匹配grep。

    POSIX字符

    为了在不同国家的字符编码中保持一致,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

    • [:alnum:] #文字数字字符
    • [:alpha:] #文字字符
    • [:digit:] #数字字符
    • [:graph:] #非空字符(非空格、控制字符)
    • [:lower:] #小写字符
    • [:cntrl:] #控制字符
    • [:print:] #非空字符(包括空格)
    • [:punct:] #标点符号
    • [:space:] #所有空白字符(新行,空格,制表符)
    • [:upper:] #大写字符
    • [:xdigit:] #十六进制数字(0-9,a-f,A-F)

    查找指定进程

    > ps -ef | grep java
    root     16934     1  0 Feb25 ?        00:12:23 java -jar demo.jar
    root      6891  2151  0 21:42 pts/2    00:00:00 grep --color=auto java
    

    第一条记录是查找出的进程;第二条结果是grep进程本身,并非真正要找的进程。

    查找进程的个数

    > ps -ef | grep -c java
    10
    
    > ps -ef | grep java -c
    10
    

    查找文件中的关键词

    > cat rumenz.txt 
    rumenz.txt
    one
    tow
    qaz
    redis
    linux123
    linuxxxx
    rumenz
    123
    789
    
    > grep "linux" rumenz.txt 
    linux123
    linuxxxx
    
    // -n 显示行号
    
    > grep -n "linux" rumenz.txt 
    6:linux123
    7:linuxxxx
    

    从文件中读取关键词进行搜索

    // 待查找的文本
    > cat rumenz.txt 
    rumenz.txt
    one
    tow
    qaz
    redis
    linux123
    linuxxxx
    rumenz
    123
    789
    
    // 需要查找的多个关键词
    
    > cat k.txt 
    linux
    redis
    
    > cat rumenz.txt | grep -f k.txt
    redis
    linux123
    linuxxxx
    
    //显示行号
    
    > cat rumenz.txt | grep -nf k.txt 
    5:redis
    6:linux123
    7:linuxxxx
    

    输出rumenz.txt文件中含有从k.txt文件中读取出的关键词的内容行,-n显示行号

    从多个文件中查找关键词

    > grep "linux" rumenz.txt rumenz123.txt 
    rumenz.txt:linux123
    rumenz.txt:linuxxxx
    rumenz123.txt:linux123
    rumenz123.txt:linuxxxx
    rumenz123.txt:linux100
    

    多文件时,输出查询到的信息内容行时,会把文件的命名在行最前面输出并且加上":"作为标示符

    从多个文件中查找关键词,使用通配符

    
    // 查找当前目录下所有以rumenz开头的文件
    > grep "linux" rumenz*
    rumenz123.txt:linux123
    rumenz123.txt:linuxxxx
    rumenz123.txt:linux100
    rumenz.txt:linux123
    rumenz.txt:linuxxxx
    
    // 查找当前目录下所有以.txt结尾的文件
    
    > grep "linux" *.txt
    k.txt:linux
    rumenz123.txt:linux123
    rumenz123.txt:linuxxxx
    rumenz123.txt:linux100
    rumenz.txt:linux123
    rumenz.txt:linuxxxx
    

    grep不显示本身进程

    > ps -ef | grep redis | grep -v grep
    root     14383     1  0 Jan08 ?        01:16:03 /opt/redis-5.0.8/src/redis-server *:6379
    polkitd  31977 31941  0 Jan11 ?        01:14:22 redis-server *:6379
    

    grep -v grep不显示grep进程本身

    找出以r开头的行内容

    > cat rumenz.txt | grep ^r
    rumenz.txt
    redis
    rumenz
    

    找出非r开头的行内容

    > cat rumenz.txt | grep ^[^r]
    one
    tow
    qaz
    linux123
    linuxxxx
    123
    789
    

    输出以3结尾的行内容

    > cat rumenz.txt | grep 3$
    linux123
    123
    

    显示包含li或者23字符的内容行

    > at rumenz.txt | grep -E "li|23"
    linux123
    linuxxxx
    123
    

    查找指定格式的文件

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

    > grep "[a-z]\{3\}" *.txt
    k.txt:linux
    k.txt:redis
    rumenz123.txt:rumenz.txt
    rumenz123.txt:one
    rumenz123.txt:tow
    rumenz123.txt:qaz
    rumenz123.txt:redis
    rumenz123.txt:linux123
    rumenz123.txt:linuxxxx
    rumenz123.txt:rumenz
    rumenz123.txt:linux100
    rumenz.txt:rumenz.txt
    rumenz.txt:one
    rumenz.txt:tow
    rumenz.txt:qaz
    rumenz.txt:redis
    rumenz.txt:linux123
    rumenz.txt:linuxxxx
    rumenz.txt:rumenz
    

    以递归的方式查找符合条件的文件

    > grep  -rl "rumenz" /root/test/
    /root/test/src/sbin/patch.log
    /root/test/src/doc/rumenz.txt
    /root/test/src/doc/rumenz123.txt
    /root/test/src/InfiniteLoop.class
    /root/test/src/InfiniteLoop.java
    

    查找rumenz.txt中包含linux行的前2行

    > grep -B 2 "linux" rumenz.txt
    qaz
    redis
    linux123
    linuxxxx
    

    查找rumenz.txt中包含linux行的后2行

    > grep -A 2 "linux" rumenz.txt
    linux123
    linuxxxx
    rumenz
    123
    

    查找rumenz.txt中包含linux行的前后各2行

    > grep -C 2 "linux" rumenz.txt
    qaz
    redis
    linux123
    linuxxxx
    rumenz
    123
    

    原文链接:https://rumenz.com/rumenbiji/linux-grep.html
    微信公众号:入门小站

    linux常用命令速查手册PDF下载

    3669页vim参考手册PDF下载

    阿里云ECS运维Linux系统诊断PDF下载

    Docker速查手册PDF下载

    Linux学习笔记【强悍总结值得一看】PDF下载

    shell简明教程PDF下载

    展开全文
  • phi-grep.el Elisp実装の编集可能な再帰grep elisp中的交互式可编辑递归grep实现 截屏 用法 需要这个脚本 (require 'phi-grep) 然后可以使用以下命令。 文件中的phi-grep grep在单个文件中 phi-grep在目录中 ...
  • Linux命令详解之 grep

    万次阅读 多人点赞 2021-01-01 11:56:50
    grep(global search regular express and print out line)打印匹配的行(内容) 类似的命令包括egrep、fgrep、rgrep ## 命令用法: grep [选项] 匹配项[PATTERN...] []表示可选参数 grep [选项[ [-e 匹配项...
  • linux grep 正则表达式

    千次阅读 2021-03-30 20:44:00
    1、grep命令 2、grep 与正则表达式 3、关于匹配的实例 4、grep实例 1、grep命令 功能:输入文件的每一行中查找字符串。 基本用法: grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名 参数...
  • Linux多文件查找工具之grep

    千次阅读 2021-05-09 06:57:26
    1. 简介grep全称Global Regular Expression Print,全局正则表达式打印.在这里面提到了三个关键词,我们逐个进行分析,这样有助于我们理解grep这个命令的作用,1.global说明该命令可以用于所有用户(交互式用户) 2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,068,061
精华内容 427,224
关键字:

grep