linux基础三剑客之grep

1、grep命令

基本介绍

  grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrep个fgrep。

  grep英文名:Global  search  Regular  expression  and  Print  out  the  line

  grep命令的作用:文本所搜工具。根据用户指定的模式对目标文件逐行进行匹配检查,并且打印匹配的行

  模式:由正则表达式字符串及文本字符所编写的过滤条件

  正则表达式:英文名regular  expression,解释:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或者通配的功能

  正则表达式分类

    基本正则表达式:basic  regular  expression,简写BRE

    扩展正则表达式:extend regular  expression,简写ERE

    注意:grep默认支持的是基本正则表达式,但是grep命令可以是用选项-E来使用扩展正则表达式。egrep命令默认支持扩展正则表达式

  正则表达式引擎:检查一个模式是否匹配一段文本信息的程序,不同的编程语言使用的正则表达式引擎可能不同。引擎不同,检查字符匹配的算法不同。

  grep命令内部自带了正则表达式引擎来实现文本的检查

  基本语法

    grep [OPTIONS] PATTERN [FILE...]

     grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

      常用选项

        --color-auto:对匹配的文本内容进行着色

        -v:显示不能够被pattern匹配的行

        -i:忽略字符大小写

        -o:仅显示匹配到的字符串

        -q:对匹配或者不匹配的内容不输出任何信息,表示是静默模式

        -A  num:显示匹配到的行及在这之后多显示num行

        -B  num:显示匹配到的行及在这之前多显示num行

        -C  num:显示匹配到的行及在这之前和之后显示num行

        -E:使用扩展正则表达式

        -F:使用固定字符正则表达式

        -G:表示使用基本正则表达式

        -P:表示使用perl正则表达式

  基本正则表达式的元字符

    字符匹配元字符

      .:匹配任意单个字符

      []:匹配指定范围内的任意单个字符

      [^]:匹配范围之外的任意单个字符

      也支持字符集范围表示

      [:digit:]、[:alnum:]、[:alpha:]、[:lower:]、[:upper:]、[:punct:]

        使用案例

[root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt

hal

kde

lvm

ntp

opt

pki

ppp

rpc

rpm

ssh

ssl

xdg

xml

yum

qwe

    匹配次数元字符

      基本介绍

        用在要指定次数的字符后边,用于指定前面的字符要出现的次数

    匹配次数元字符

      *:匹配前面的字符0次或者多次

      使用案例

[root@oldboy ~]# grep "x*y" grep.txt
xay
xbby 

      \?:匹配前面的字符0次或者1次

.      *:匹配任意长度字符

      \+:匹配前面字符至少一次

      \{m\}:匹配前面的字符m次。

      \{m,n\}:匹配掐面字符至少m次,至多n次

        \{m,\}:匹配前面字符至少m次,多则不限

        \{0,n\}:匹配前面的字符至多n次

        使用注意

          为什么要使用\?-----因为?问号、加号+、大括号{}在linux中的bash解释器中有特殊意义,用反斜线在意就让他表示?问号原来的意义,即?问号在bash中表示任意字符,{}大括号在bash中表示内容展开,因此为了避免在bash中被解释,那么使用反斜线转义

    位置锚定元字符

      基本介绍

        要求指定的字符串模式必须出现在特定位置,那么得使用位置锚定元字符

      位置锚定元字符有

        ^:行首锚定,用于模式的最左侧

        $:行尾锚定,用于模式的最右侧

        ^PATTERN$:用于模式匹配整行

        ^$:匹配空行

          ^[[:space:]]*$:匹配整行为空格行或者空行

        \<或者\b:单词的词首锚定,用于单词模式的左侧

        \>或者\b:单词的词尾锚定,用于单词模式的右侧

        \<PATTERN\>:单词锚定,用于匹配整个单词

    分组

      \(\):用于将一个后者多个字符串捆绑在一起,当做一个整体进行处理,小括号在bash中也表示特殊符号

      后项引用:引用前面的分组括号中的模式所有匹配的字符(并不是引用匹配的模式,而是引用的匹配模式下的字符串)

      案例演示:

[root@oldboy ~]# grep "\(\<[[:alpha:]]\{1,3\}t\>\).*\1" /etc/passwd

root:x:::root:/root:/bin/bash

halt:x:::halt:/sbin:/sbin/halt

      使用注意:

        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3...

        \1:表示第一次被分组小括号所匹配的内容

        \2:表示第二次被分组小括号所匹配的内容

        .....

        举例:

          \(ab\+\(xy\{2,\}\))*

            \1匹配上面的:ab\+\(xy\)

            \2匹配上面的:xy\{2,\}

        使用注意

          grep命令默认使用的是贪婪模式匹配,即最大匹配。

      为什么要使用位置锚定符?

        grep正则匹配默认是每一行按照正则模式一个字符一个字符的匹配,那么有匹配的字符串可能出现在一行内容的任意位置,因此,如果我们有需求要匹配的字符串在指定的位置(比如:在行首、行尾、词首、词尾),那么就得使用位置锚定元字符

      单词:在linux正则表达式中表示由特殊符号分割的一个字符串,纯数字字符串也算一个单词(虽然在显示不算真正意义的单词)

    案例演示题库

      显示/proc/meminfo文件中以大小写a、b开头的行

[root@oldboy ~]# grep -i "^a" /proc/meminfo

Active:             kB

Active(anon):       kB

Active(file):       kB

AnonPages:          kB

AnonHugePages:          kB

[root@oldboy ~]# grep "^[aA].*" /proc/meminfo

Active:             kB

Active(anon):       kB

Active(file):       kB

AnonPages:          kB

AnonHugePages:          kB

      显示/etc/passwd文件中不以/bin/bash结尾的行

[root@oldboy ~]# grep -v  "/bin/bash$"  /etc/passwd 

      显示/etc/passwd文件中GID最大的用户名

[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n 

www:x::::/home/www2:/bin/bash

[root@oldboy ~]# sort -t: -k3 -n  /etc/passwd|tail -n |cut -d: -f1

www

      显示/etc/passwd的oldboy用户是否存在,如果存在显示他的默认shell

[root@oldboy ~]# grep "^\<oldboy\>" /etc/passwd

oldboy:x:::lan:/home/oldboy:/bin/csh

[root@oldboy ~]# grep "^\<root\>" /etc/passwd && grep "^\<root\>" /etc/passwd|cut -d: -f7

root:x:::root:/root:/bin/bash

/bin/bash 

      显示/etc/passwd文件中UID是三位数的用户名

[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd

[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd|cut -d: -f1

      显示netstat  -tan中出现State是LISTEN的行

[root@oldboy ~]# netstat -tan|grep "LISTEN[[:space:]]*"

tcp            0.0.0.0:           0.0.0.0:*                   LISTEN      

tcp               127.0.0.1:     0.0.0.0:*                   LISTEN      

tcp               127.0.0.1:      0.0.0.0:*                   LISTEN      

tcp               :::           :::*                        LISTEN      

tcp               :::            :::*                      LISTEN      

      显示/etc/passwd文件中用户名与默认shell名相同的行

[root@oldboy ~]# grep "\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd

sync:x:::sync:/sbin:/bin/sync

shutdown:x:::shutdown:/sbin:/sbin/shutdown

halt:x:::halt:/sbin:/sbin/halt

bash:x::::/home/bash:/bin/bash

2、egrep命令

基本介绍

  扩展正则表达式

    egrep = egrep  -E

基本语法

   grep [OPTIONS] PATTERN [FILE...]

  grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

  扩展正则表达式的元字符

    字符匹配

      .:匹配任意一个字符

      []:匹配范围内的字符

      [^]:匹配范围外的字符

    次数匹配

      *:匹配0次或者多次

      ?:匹配0次或者1次

      +:匹配1次或者多次

      {m}:匹配m次

      {m,n}:匹配至少m次,至多n次

    锚定字符

      ^:锚定行首

      $:锚定行尾

      \<:锚定词首

      \>:锚定词尾

    分组

      ()

      后项引用变量\1,\2,\3....

    或者

      a|b:支持二选一(扩展正则表达式比基本正则表达式元字符多了二选一)

  练习问题

    显示当前系统能够root、centOS或者oldboy用户的默认shell和UID

[root@oldboy ~]# grep -E "^(root|centos|oldboy)\>" /etc/passwd

root:x:::root:/root:/bin/bash

oldboy:x:::lan:/home/oldboy:/bin/csh

    找出/etc/rc.d/init.d/functions文件中,某单词跟一个小括号的行

[root@oldboy~]#egrep "^\<[_[:alpha:]]+\>[[:space:]]*\(\)" /etc/rc.d/init.d/functions

    使用echo命令输出一个命令,使用egrep取出路径的基名(基名:整个路径的最后一个文件或者目录)

[root@oldboy ~]# echo "/etc/fstab" |grep -E -o "[^/]+\/?\>$"

fstab

    找出ifconfig命令结果中的IP地址

[root@oldboy ~]# ifconfig|grep -E -o "(\<[[:digit:]]+\>\.?){3}\.?[[:digit:]]+"

192.168.173.140

192.168.173.255

255.255.255.0

127.0.0.1

255.0..

找出ifconfig命令结果中的1-255的数值

[root@oldboy ~]# ifconfig | grep -E -o "\<[0-5]+\>"|sort -u -n

   使用注意

     如果是扩展正则表达式,那么它的匹配模式的扩展正则元字符有一些不用转义,比如:小括号,大括号,加号等,但是锚定词首和词尾都需要加转义字符

3、fgrep命令

基本介绍

  fgrep命令不支持正则表达式搜索,你搜索字符是什么,就按照你搜索的去匹配

基本语法

  grep  [OPTIONS]  [-f PATTERN]  [FILE...]

基本使用

[root@oldboy ~]# grep -F "a..t" fgrep.txt

a..t

[root@oldboy ~]# grep -F "^h" fgrep.txt

^h

linux三剑客之grep的更多相关文章

  1. (转)不看绝对后悔的Linux三剑客之grep实战精讲

    不看绝对后悔的Linux三剑客之grep实战精讲 原文:http://blog.51cto.com/hujiangtao/1923675 https://www.cnblogs.com/peida/a ...

  2. Linux 三剑客之grep

    目录 Linux 三剑客之grep 搭配命令-find 三剑客之grep: 正则表达式: Linux 三剑客之grep 搭配命令-find find命令是根据文件的名称或者属性查找文件,并不会显示文件 ...

  3. Linux三剑客之grep常用参数详细总结

    三剑客grep总结 grep  : Linux三剑客老三      过滤需要的内容 参数: grep一般常用参数: -a :在二进制文件中,以文本文件的方式搜索数据 -c :计算找到 ’ 搜索字符串 ...

  4. Linux三剑客老三---grep

    1.Linux三剑客老三 过滤需要的内容,例子:grep -v oldboy hello.txt grep一般常用参数: -a:在二进制文件中,以文本文件的方式搜索数据. -c:计算找到"搜 ...

  5. Linux三剑客之grep 与 egrep

    grep: Linux上文本处理三剑客 grep:文本过滤(模式:pattern)工具; *(grep, egrep, fgrep) sed:stream editor,文本编辑工具: awk:Lin ...

  6. linux三剑客之一grep

    正则表达式(Regular Expression) 目录 起源 正则表达式是什么? 两类基本正则表达式 正则表达式元字符 Linux上文本三剑客 小试牛刀 总结 一.起源   正则表达式这个名词,相信 ...

  7. Linux三剑客:grep、awk、sed

    ---------------------------------------------------------------------------------------------------- ...

  8. Linux 三剑客之 grep 使用详解

    Linux 最重要的三个命令在业界被称为三剑客,它们是:awk.sed.grep.sed 已经在上篇中讲过,本文要讲的是 grep 命令. 我们在使用 Linux 系统中,grep 命令的使用尤为频繁 ...

  9. linux 三剑客命令(grep,sed ,awk)

    grep 命令 :强大的文本’搜索’工具    1.grep   -n   'word'  file_name 在file_name文件中找到word所在的所有行并显示.-n 为显示行号.     2 ...

随机推荐

  1. vue+富文本编辑器UEditor

    vue+富文本编辑器UEditor 昨天的需求是把textarea换成富文本编辑器的形式, 网上找了几种富文本编辑器ueditor.tinymce等, 觉得ueditor实现双向绑定还挺有意思, 分享 ...

  2. 软件测试第一次试验JUnit

    一.Junit, hamcrest以及eclemma的安装 对于Junit和hamcrest的安装,我并没有从下载Junit和hamcrest相关的jar包然后通过build path导入到项目中,而 ...

  3. 封装一个redis操作类来操作hash格式

    最近项目要用redis,依然是基于tp3.2. 发现thinkphp3.2自带的缓存类并不好使用,就自己封装了一个 目前只支持hash格式,其他数据类型的操作后面用到的时候再补充 <?php / ...

  4. C++学习笔记(一):C++基础知识

    一.C++基础知识 新的数据类型 C语言中的数据类型 C++中新的数据类型 思考:新的数据类型有什么好处?请看下面的代码: 可以见得:新的类型使整个程序更加简洁,程序变得易读易懂!这个就是bool类型 ...

  5. setTimeout代替setInterval的写法以及setInterval的弊端以及越来越快的解决办法

    平常经常遇到的一个问题,很多人想间隔时间执行一些事件的时候,第一时间就会想到用setInterval,但是setInterval村子啊不少弊端哦. 弊端1:setInterval会无视错误代码,即使代 ...

  6. jquery的js代码兼容全部浏览器的解决方法

    //以下均可console.log()实验   var winW=document.body.clientWidth||document.docuemntElement.clientWidth;//网 ...

  7. Java数据库连接池详解

    http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 对于共享资源,有一个很著名的设计模式:资源池(Resource P ...

  8. SSM--spring框架

    他是SpringFramework创始人,interface21 CEO Spring 的作者:Rod Johnson 一  :Spring的核心IOC和AOP(本处详解IOC) IOC:控制反转:( ...

  9. Mysql 了解changeBuffer 与 purge 调优

    需要删除.新增记录或更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer中, ...

  10. ubuntu16.04安装anaconda、环境配置

    anaconda默认3.7降级到3.6 conda install python=3.6 anaconda安装后找不到conda命令: 执行测试命令 conda info -e conda: comm ...