• Linux三剑客命令---grep


    一 grep常用参数

    参数作用
    -v结果取反
    -n显示行号
    -i不区分大小写
    -l只输出文件名
    -c统计出现的行的数目
    -o只显示匹配部分的内容
    -w只显示全匹配内容的整行内容

    1)-v 取反

    匹配文件内所有的空行grep "^$" test.txt
    忽略文件内所有的空行 grep -v "^$" test,txt
    ^和$分别表示开头和结尾,中间为空,连起来就是匹配空行。

    2)-n 显示行号

    [root@db01 scripts]# grep -n 200 test.txt 
    4:200	Tarija	  BOL	        Tarija	        125255
    7:2000	Changzhi  CHN	        Shanxi	        317144
    
    • 1
    • 2
    • 3

    3)-i 不区分大小写

    该字母的大小写都会被匹配到

    4)-l 只输出匹配到内容的文件名

    (此处是L字母的小写l)
    例如,匹配 /tmp 目录下,所有含oldboy信息的文件 grep -l "oldboy" /tmp

    5) -c 匹配该内容总共出现的行的数目

    假如匹配oldboy,某一行中,oldboy出现了3次,但最后统计,这个只算1行。

    6)-o 和 -w 的区别

    以匹配Linux的IP地址为例。
    使用ifconfig命令再通过inet就可以找到该行中存在的IP。

    [root@server ~]# ifconfig|grep  inet
            inet 10.0.0.11  netmask 255.255.255.0  broadcast 10.0.0.255
            inet6 fe80::20c:29ff:fef1:4a52  prefixlen 64  scopeid 0x20<link>
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用-o只会显示参数后的内容,其他什么都没有。

    [root@server ~]# ifconfig|grep -o inet
    inet
    inet
    inet
    inet
    inet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用-w会匹配到这串完整字符的所有行的内容,不多匹配,也不少匹配

    [root@server ~]# ifconfig|grep -w inet
            inet 10.0.0.11  netmask 255.255.255.0  broadcast 10.0.0.255
            inet 127.0.0.1  netmask 255.0.0.0
            inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
    
    • 1
    • 2
    • 3
    • 4

    二 部分测试环境

    [root@db01 scripts]# cat test.txt 
    
    ID	  Name	  CountryCode	District	Population
    50	  Tiaret	  DZA	    Tiaret	    100118.
    100	  Paraná	  ARG	    Entre Rios	207041
    200	  Tarija	  BOL	    Tarija	    125255
    500	  Bolton	  GBR	    England	    139020.
    1000  Taman	      IDN	    East Java	107000
    2000  Changzhi    CHN	    Shanxi	    317144
    oldboy
    oldbey
    oldboey
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三 基础正则符号

    1)点符号.

    匹配任意一个且只有一个字符

    2)星符号*

    匹配前一个字符连续出现了0次或者多次
    匹配B字符 grep "B*" test.txt

    3)点和星结合 .*

    匹配任意所有字符
    匹配“England"字符 grep "E.*d" test.txt

    4)转义符号\

    使得有特殊意义和普通意义的符号间可以相互转换

    ##\n换行符
    [root@db01 scripts]# echo -e "hello\nworld"
    hello
    world
    
    • 1
    • 2
    • 3
    • 4

    过滤每行的最后一个字符 grep ".$" test.txt
    过滤一行中最后一个是点符号的行 grep "\.$" test.txt

    ps.双引号、单引号、反引号的区别
    单引号'' 所见即所得,直接输出内部字符串,不会对特殊字符解析
    双引号""会解析特殊字符;若忽略特殊字符仅输出,则在前面加上反斜杠\即可
    反引号 内含字符串命令,会先执行该命令

    5)中括号 [ ]

    匹配多个字符

    ##匹配oldboy和oldbey
    [root@db01 scripts]# grep "oldb[oe]y" test.txt 
    oldboy
    oldbey
    
    • 1
    • 2
    • 3
    • 4

    找到1和2开头的行

    [root@db01 scripts]# grep "^[12]" test.txt 
    100	Paraná	  ARG	        Entre Rios	207041
    200	Tarija	  BOL	        Tarija	        125255
    1000	Taman	  IDN	        East Java	107000
    2000	Changzhi  CHN	        Shanxi	        317144
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6)排除符号 [^ ]

    排除o和e,其他都匹配上。grep "[^oe]" test.txt

    四 扩展正则符号

    grep和sed不能直接识别,需要添加参数才能识别。
    grep -E 或 egrep
    sed -r

    1)加号+

    匹配前一个字符连续出现了1次或者多次
    匹配出现的所有数字0 egrep "0+" test.txt

    2)竖线符号 |

    用于匹配多个信息

    ##匹配oldboy和oldbey
    [root@db01 scripts]# grep -E "oldboy|oldbey" test.txt 
    oldboy
    oldbey
    
    • 1
    • 2
    • 3
    • 4

    3)小括号 ( )

    作用一:指定信息的整体匹配

    [root@db01 scripts]# grep -E "oldb(oe)y" test.txt 
    oldboey
    [root@db01 scripts]# grep -E "oldb(o|e)y" test.txt 
    oldboy
    oldbey
    [root@db01 scripts]# grep -E "oldb[oe]y" test.txt 
    oldboy
    oldbey
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    作用二:在sed命令中后项引用前项,此处举例简单说明。

    要求:批量创建user01 user02 … user10 一共10 个用户。

    echo user{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash
    
    • 1

    echo user{01…10} 批量创建10个用户

    |xargs -n1 用管道命令把输出结果表示成一列,并作为后续sed命令的输入结果

    sed -r ‘s#(.*)#useradd \1#g’

    参数 -r 识别扩展正则符号;
    (.*)  表示前面得到的所有输出内容,包括user01..user10
    \1 表示引用了前面的(.*),即后项引用前项,二者内容完全一样
    |bash 表示将最后的语句调用shell,变成可执行的linux命令
    在 sed -r s#A#B#g 的格式下,把A替换成B,此处同理
    把user01 换成了 useradd user01,再调用bash,变成命令,创建用户user01。以此类推。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此外,后向引用前项中的”前项“和”后项“可以有多个元素

    ##将一串元素引用
    [root@db01 scripts]# echo 123456|sed -r 's#([1-6]+)#<\1>#g'
    <123456>
    [root@db01 scripts]# echo 123456|sed -r 's#(.*)#<\1>#g'
    <123456>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以”一变多“

    [root@db01 scripts]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\2><\3>#g"
    <12><34><56>
    [root@db01 scripts]# echo 123456|sed -r "s#(12)(34)(56)#<\2><\3><\1>#g"
    <34><56><12>
    [root@db01 scripts]# echo 123456|sed -r "s#(..)(..)(..)#<\3><\2><\1>#g"
    <56><34><12>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4)大括号{ }

    指定字符连续匹配的次数

    a{m,n}表示字符a至少连续出现m次,最多出现n次

    准备测试环境

    [root@canway01 tmp]# cat test.txt 
    k
    kk
    kabckabck
    kkabc
    kkkabckabc
    kkabckkkkk
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    要求:找到k至少连续出现2次,最多连续出现4次的行

    [root@canway01 tmp]# egrep 'k{2,4}' test.txt 
    kk
    kkabc
    kkkabckabc
    kkabckkkkk
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果不使用识别扩展正则符号的参数egrepgrep -E
    也可以用转义符,识别大括号

    [root@canway01 tmp]# grep 'k\{2,4\}' test.txt 
    kk
    kkabc
    kkkabckabc
    kkabckkkkk
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5)问号

    定义匹配前一个字符出现0或者1次

    [root@canway01 tmp]# cat test.txt 
    oldboy
    oldboey
    oldbey
    oldy
    oldby
    oldbby
    oldbbby
    [root@canway01 tmp]# egrep "ldb?y" test.txt 
    oldy
    oldby
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    21天经典算法之折半插入排序
    基于Java+SpringBoot+Vue前后端分离成绩管理系统设计和实现
    cmake应用:集成gtest进行单元测试
    Educational Codeforces Round 132 (Rated for Div. 2) A.B.D
    Kotlin中正确的使用Handler
    数据结构预算法——刷题记录二
    拦 截 器
    国外顶尖程序员手写,402页汉译版微服务与事件驱动架构开发手册
    k8s中应用GlusterFS类型StorageClass
    前端element表格导出excel
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/127953520