• 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
  • 相关阅读:
    【语音识别入门】概述
    LnReader编译
    【mysql学习笔记26】视图
    [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
    【MySQL】MVCC原理分析 + 源码解读 -- 必须说透
    [相向双指针] 167. 两数之和 II - 输入有序数组,15. 三数之和,11. 盛最多水的容器,42. 接雨水
    推荐系统 推荐算法 (小红书为例) 笔记 2
    Ubuntu 22.04 远程桌面
    上传航测影像就能土方计算?!0基础倾斜摄影土方计算流程
    Bitmaps
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/127953520