• Linux5.5 正则


    正则:一串有规律的字符串 

    grep命令

      grep可以实现的,egrep都可以实现。

      grep    [-cinvrABC]   'word'   filename【自带color选项】

    #无任何选项
    [root@chy002 tmp]# grep 'root' passwd.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

      -c 行数

    [root@chy002 tmp]# grep -c 'root' passwd.txt
    2

      -i  不区分大小写

    [root@chy002 tmp]# grep -i 'root' passwd.txt
    ROOt
    ROOT
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

      -n  显示行号

    [root@chy002 tmp]# grep -in 'root' passwd.txt
    1:ROOt
    2:ROOT
    3:root:x:0:0:root:/root:/bin/bash
    12:operator:x:11:0:operator:/root:/sbin/nologin

      -v  取反

    #不带nologin行过滤
    [root@chy002 tmp]# grep -vni 'nologin' passwd.txt
    1:ROOt
    2:ROOT
    3:root:x:0:0:root:/root:/bin/bash
    8:sync:x:5:0:sync:/sbin:/bin/sync
    9:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    10:halt:x:7:0:halt:/sbin:/sbin/halt
    22:chy002:x:1000:1000::/home/chy002:/bin/bash
    23:user:x:1001:1001::/home/user:/bin/bash
    24:user1:x:1002:1006::/home/user1:/bin/bash
    25:user2:x:1004:1002::/home/user2:/bin/bash
    26:user3:x:1005:1002::/tmp/user3:/bin/bash
    27:user4:x:1009:1006::/home/user5:/bin/bash

      -r  遍历所有子目录

    [root@chy002 tmp]# grep -in 'root' /tmp/
    grep: /tmp/: 是一个目录
    [root@chy002 tmp]# grep -rin 'root' /tmp/
    /tmp/123.txt:1:root:x:0:0:root:/root:/bin/bash
    /tmp/123.txt:10:operator:x:11:0:operator:/root:/sbin/nologin
    /tmp/321.txt:1:root:x:0:0:root:/root:/bin/bash
    /tmp/321.txt:10:operator:x:11:0:operator:/root:/sbin/nologin
    /tmp/passwd.txt:1:ROOt
    /tmp/passwd.txt:2:ROOT
    /tmp/passwd.txt:3:root:x:0:0:root:/root:/bin/bash
    /tmp/passwd.txt:12:operator:x:11:0:operator:/root:/sbin/nologin
    ... ...

      -A  后面跟数字过滤出符合要求的行以及下面n行

    [root@chy002 tmp]# grep -nA2 'root' passwd.txt
    3:root:x:0:0:root:/root:/bin/bash
    4-bin:x:1:1:bin:/bin:/sbin/nologin
    5-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    12:operator:x:11:0:operator:/root:/sbin/nologin
    13-games:x:12:100:games:/usr/games:/sbin/nologin
    14-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

      -B   过滤出符合要求的行及上面的n行

      -C  同时过滤出符合要求的行及上下各n行

           [0-9a-zA-Z]

    [root@chy002 tmp]# grep -nv '[0-9]' passwd.txt
    1:ROOt
    2:ROOT

      [^]  非的意思

    #匹配非小写字母开头的行
    [root@chy002 tmp]# grep -n '^[^a-z]' passwd.txt
    1:ROOt
    2:ROOT
    

      [^$]  空行

    #去除文本中的空行
    [root@chy002 tmp]# grep -nv '^$' 1.txt
    1:sadf
    2:123
    4:qwe123
    6:Q2
    

      o*o  表示*号左边的字符重复0-n次,一定匹配右边一个字符o

    [root@chy002 tmp]# grep -n 'r*o' passwd.txt
    2:roooooo
    3:ro
    8:root:x:0:0:root:/root:/bin/bash
    9:bin:x:1:1:bin:/bin:/sbin/nologin
    10:daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ... ...

      r.o   r和o中间任意一个字符,必须有一个

    [root@chy002 tmp]# grep -n 'r.o' passwd.txt
    2:roooooo
    8:root:x:0:0:root:/root:/bin/bash
    17:operator:x:11:0:operator:/root:/sbin/nologin
    

      .*   匹配全部,包含所有字符及空行

      

      { }  花括号,使用egrep或者 -E 可以不使用脱义符号

    [root@chy002 tmp]# grep 'o{2}' passwd.txt
    o{2}
    [root@chy002 tmp]# grep 'o{2}' passwd.txt
    roooooo
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    

      o+b  b前面1次或者多次o,必须b紧挨着o,加号还是需要脱义,可以使用egrep 或 -E 

    [root@chy002 tmp]# grep 'o+t' passwd.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

      o?b  b前面o重复次数0或者1,只要有一个b就能匹配

    [root@chyuanliu-01 tmp]# grep 'o?b' 123.txt
    robt
    ro123bt
    roobt
    roobbt
    robobt
    rbt
    orbt
    

      |   或者符号

    [root@chyuanliu-01 tmp]# grep 'root|nologin' passwd.txt
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    

    sed命令

      sed关键在于替换,与grep匹配最主要的区别在于能对匹配的字符进行删除更改等操作,无color选项。

      匹配打印指定行,-n 只打印符合规则,p打印

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '10'p text.txt
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# wc -l text.txt
    28 text.txt
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '10,14'p text.txt
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '/root/'p text.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

       不区分大小写进行打印,I 不区分大小写

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '/root/'Ip text.txt
    root:x:0:0:root:/root:/bin/bash
    ROOT:
    operator:x:11:0:operator:/root:/sbin/nologin
    

       |或者

    [root@localhost tmp]# sed -nr '/root|home/'p passwd
    #root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    mysql:x:1000:1000::/home/mysql:/bin/bash
    php-fpm:x:1001:1001::/home/php-fpm:/sbin/nologin
    user:x:1002:1002::/home/user:/bin/bash 

      同时执行多个任务,-e  同时执行

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -e '/root/'Ip -e'/ftp/'p -n text.txt
    root:x:0:0:root:/root:/bin/bash
    ROOT:
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 
    [root@localhost tmp]# sed -e '1'p -e '/home/'p -n passwd
    #root:x:0:0:root:/root:/bin/bash
    mysql:x:1000:1000::/home/mysql:/bin/bash
    php-fpm:x:1001:1001::/home/php-fpm:/sbin/nologin
    user:x:1002:1002::/home/user:/bin/bash
    [root@localhost tmp]# sed -e '1'p -e '/root/'p -n passwd
    #root:x:0:0:root:/root:/bin/bash
    #root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

      打印全部,1,$

    [root@localhost tmp]# sed -n '1,$'p passwd
    #root:x:0:0:root:/root:/bin/bash
    #bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sb
    .......

      脱意  -r  不识别  +|{}()

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '/ro+/'p text.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    chrony:x:997:995::/var/lib/chrony:/sbin/nologin
    
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '/ro+/'p text.txt
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -nr '/ro+/'p text.txt
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    chrony:x:997:995::/var/lib/chrony:/sbin/nologin
    

       打印某行到某行之间

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '/mysql/,/admin/'p text.txt
    mysql:x:1001:1001::/home/mysql:/sbin/nologin
    www:x:1002:1002::/home/www:/bin/bash
    admin:x:1003:1003::/home/admin:/bin/bash
    

      删除指定行,不会在原文件上修改,若需要修改要加  -i 选项

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -e '/www/'d -e  '/mysql/'d text.txt
    ... ...
    tcpdump:x:72:72::/:/sbin/nologin
    admin:x:1003:1003::/home/admin:/bin/bash
    chyuanliuNJ:x:1004:1004::/home/chyuanliuNJ:/bin/bash
    #删除含有www 和 mysql的行,如果加上-n不会输出任何东西,因为-n只打印命令中的指令
    

       替换,选项s  为替换   g  为全局。也可以作为删除选项

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '27,28s/www/WWW/g'p text.txt
    WWW:x:1002:1002::/home/WWW:/bin/bash
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -n '27,28s/[0-9]//g'p text.txt
    www:x::::/home/www:/bin/bash
    admin:x::::/home/admin:/bin/bash
    

       如果遇到多斜杠替换,可以把sed的斜杠操作符换成#等等

    #替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
    [root@chyuanliuNJ awk]# sed -n '5,8s#sbin/nologin#bin/login#g'p text.txt
    bin:x:1:1:bin:/bin:/bin/login
    bin:x:1:1:bin:/bin:/bin/login
    

      调换位置,下面的 1可以换成&,&确切含义是前一对/ /内全部内容

    [root@localhost tmp]# head -2 passwd |sed -nr 's/(.*)/chyuanliu:&/'p
    chyuanliu:#root:x:0:0:root:/root:/bin/bash
    chyuanliu:#bin:x:1:1:bin:/bin:/sbin/nologin
    #在每行之前加字符
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -nr '1,2s/(.*)/chyuanliu:1/'p text.txt
    chyuanliu:root:x:0:0:root:/root:/bin/bash
    chyuanliu:ROOT:
    #在每行最后加字符
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -nr '1,2s/(.*)/1chyuanliu:/'p text.txt
    root:x:0:0:root:/root:/bin/bashchyuanliu:
    ROOT:chyuanliu:
    
    #调换第一项和最后一项
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -nr '18,20'p text.txt
    polkitd:x:998:997:User for polkitd:/:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# sed -nr '18,20s/([^:]+):(.*):([^:]+)/3:2:1/'p text.txt
    /sbin/nologin:x:998:997:User for polkitd:/:polkitd
    /sbin/nologin:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:tss
    /sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
    

    awk命令

    可以分段操作,不能更改文件内容。可用正则符号,不用脱意

      截取文档中某段,-F指定分隔符

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# tail -n5 text.txt | awk -F ':' '{print $1}'
    tcpdump
    mysql
    www
    admin
    chyuanliuNJ
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# tail -n5 text.txt | awk -F ':' '{print $0}'
    tcpdump:x:72:72::/:/sbin/nologin
    mysql:x:1001:1001::/home/mysql:/sbin/nologin
    www:x:1002:1002::/home/www:/bin/bash
    admin:x:1003:1003::/home/admin:/bin/bash
    chyuanliuNJ:x:1004:1004::/home/chyuanliuNJ:/bin/bash
    

       截取并自定义输出链接符,定义的链接符写着输出前

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# tail -n5 text.txt | awk -F ':' '{print $1,$2,$3}'
    tcpdump x 72
    mysql x 1001
    www x 1002
    admin x 1003
    chyuanliuNJ x 1004
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# tail -n5 text.txt | awk -F ':' '{OFS="#"} {print $1,$2,$3}'
    tcpdump#x#72
    mysql#x#1001
    www#x#1002
    admin#x#1003
    chyuanliuNJ#x#1004
    
    [root@chyuanliuNJ awk]# awk -F ":" '{print $1"#"$2}' text.txt
    root#x
    root#x
    ROOT#x
    ROOT#x
    ... ...
    

      针对某个字段匹配

    #全文匹配
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk '/oo+/'
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    #只针对第五段进行匹配
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' '$5 ~ /oo+/'
    root:x:0:0:root:/root:/bin/bash
    
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# awk -F ':' '/root/ {print $1,$3}; $1 ~/admin/ {print "Sec!!"$0}; $3 ~/5/ {print "Thri!!"$0}' text.txt
    root 0
    Thri!!sync:x:5:0:sync:/sbin:/bin/sync
    operator 11
    Thri!!tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    Sec!!admin:x:1003:1003::/home/admin:/bin/bash
    

       条件操作符

    #与ASCII字符比较
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' '$3>"5"'
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    #与数字大小比较
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' '$3>5'
    ROOT:x:23
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' '$3>5 && $3<7'
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' '$3>1 && $7=="/sbin/nologin"'
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    
    [root@chyuanliuNJ awk]# awk -F ':' '{OFS="#"}{if($3>1000){print $1,$2,$3,$4}                    }' text.txt
    mysql#x#1001#1001
    mysql#x#1001#1001
    www#x#1002#1002
    www#x#1002#1002
    admin#x#1003#1003
    admin#x#1003#1003
    chyuanliuNJ#x#1004#1004
    chyuanliuNJ#x#1004#1004
    [root@chyuanliuNJ awk]# awk -F ':' '{OFS="#"} $3>1000 {print $1,$2,$3,$4}' text.txt             mysql#x#1001#1001
    mysql#x#1001#1001
    www#x#1002#1002
    www#x#1002#1002
    admin#x#1003#1003
    admin#x#1003#1003
    chyuanliuNJ#x#1004#1004
    chyuanliuNJ#x#1004#1004
    
    #针对数字的比较,加双引号是ASCII码比较,不加是纯数字比较
    [root@localhost tmp]# awk -F ':' '{OFS=","} $3>=1000 {print $1,$2,$3}' passwd
    mysql,x,1000
    php-fpm,x,1001
    user,x,1002
    [root@localhost tmp]# awk -F ':' '{OFS=","} $3>="1000" {print $1,$2,$3}' passwd
    daemon,x,2
    adm,x,3
    lp,x,4
    sync,x,5
    shutdown,x,6
    ... ...
    [root@localhost tmp]# awk -F ':' ' $7!="/sbin/nologin" {print $0}' passwd       1#root:x:0:0:root:/root:/bin/bash
    
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    ooooooooooooooo
    mysql:x:1000:1000::/home/mysql:/bin/bash
    user:x:1002:1002::/home/user:/bin/bash
    

      

      awk内置变量 。NF(段数)NR(行数)

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n5 text.txt | awk -F ':' '{print NR}'
    1
    2
    3
    4
    5
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n5 text.txt | awk -F ':' '{print $NR,$NF}'
    root /bin/bash
    x 23
    1 /sbin/nologin
    2 /sbin/nologin
    adm /sbin/nologin
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n5 text.txt | awk -F ':' '{print NR,NF}'
    1 7
    2 3
    3 7
    4 7
    5 79
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# awk 'NR>26' text.txt
    www:x:1002:1002::/home/www:/bin/bash
    admin:x:1003:1003::/home/admin:/bin/bash
    chyuanliuNJ:x:1004:1004::/home/chyuanliuNJ:/bin/bash
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n10 text.txt | awk -F ':' 'NR>=6 && NR<=10 {print NR":"$0}'
    6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    7:sync:x:5:0:sync:/sbin:/bin/sync
    8:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    9:halt:x:7:0:halt:/sbin:/sbin/halt
    10:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    

       计算操作

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n5 text.txt | awk -F ':' '$1=10 {print $0}'
    10 x 0 0 root /root /bin/bash
    10 x 23
    10 x 1 1 bin /bin /sbin/nologin
    10 x 2 2 daemon /sbin /sbin/nologin
    10 x 3 4 adm /var/adm /sbin/nologin
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# head -n5 text.txt | awk -F ':' '{OFS="##"} {$7=$3+$4} {print $0}'
    root##x##0##0##root##/root##0
    ROOT##x##23########23
    bin##x##1##1##bin##/bin##2
    daemon##x##2##2##daemon##/sbin##4
    adm##x##3##4##adm##/var/adm##7
    

       条件关系

    [root@izbp1gcpbwpui5pfbnjbhyz awk]# awk -F ':' '{(tmp=tmp+$3)}; END{print tmp}' text.txt
    7832
    [root@izbp1gcpbwpui5pfbnjbhyz awk]# awk -F ':' '{if($1=="root") print $0}' text.txt
    root:x:0:0:root:/root:/bin/bash
    
  • 相关阅读:
    TortoiseGit 的下载与安装
    CountDownLatch在多线程程序中的应用
    IDEA中maven的依赖jar包报红
    监控中的TP50
    BeanUtils.copyProperties方法,当属性Date为null解决
    SimpleDateFormat的安全问题解决方法
    java修饰符用法
    java实现快速排序
    京东2016实习生编程题—生日礼物
    美图笔试算法题(两个人拿石头判断输赢)
  • 原文地址:https://www.cnblogs.com/chyuanliu/p/7857849.html
Copyright © 2020-2023  润新知