• Linux常用基本命令:三剑客命令之-awk模式用法(2)


    1,正则模式,在/etc/passwd中 过滤出使用/bin/bash的用户

    ghostwu@dev:~/linux/awk$ awk -v FS=":" 'BEGIN{printf "%-10s%-10s%-10s
    ", "用户 名", "用户id","bash"} //bin/bash$/{printf "%-10s	%-10s	%-10s
    ", $1,$3,$NF}' /etc/passwd
    用户名       用户id      bash      
    root          0             /bin/bash 
    ghostwu       1000          /bin/bash 
    guest-iilhaz    999           /bin/bash 
    ghostwu@dev:~/linux/awk$ grep "/bin/bash" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    ghostwu:x:1000:1000:ghostwu,,,:/home/ghostwu:/bin/bash
    guest-iilhaz:x:999:999:Guest:/tmp/guest-iilhaz:/bin/bash

    >从/etc/passwd中取出inash结尾的行

    >找出符合条件的行之后,用":"号分隔,将该行文本分段

    >取出需要的段,格式化输出

    >用BEGIN模式和printf格式化文本

    2,提取/etc/passwd中,7位以上的字母账号,使用{n,m}次数匹配的正则,需要加上--re-interval

    ghostwu@dev:~/linux/awk$ awk --re-interval -v FS=":" 'BEGIN{printf "%-10s%-10s
    ","用户名","id"} /^w{7,}/{printf "%-10s	%-10s
    ", $1,$3}' /etc/passwd
    用户名       id        
    systemd-timesync    100       
    systemd-network    101       
    systemd-resolve    102       
    systemd-bus-proxy    103       
    messagebus    106       
    lightdm       108       
    whoopsie      109       
    dnsmasq       112       
    kernoops      116       
    ghostwu       1000   

    3,行范围匹配模式

    格式:awk '/正则1/,/正则2/{动作}'  FILE

    匹配ghostwu第一次出现的行,到zhanzhao第一次出现的行 之间的所有行,【注意:是以第一次出现为匹配标准】

    ghostwu@dev:~/linux/awk$ cat -n ghostwu.txt 
         1    ghostwu 20 man
         2    zhangsan 22
         3    lisi
         4    ghostwu 30 man
         5    zhanzhao 40 man
         6    peter 20 man
         7    zhanzhao 30 man
    ghostwu@dev:~/linux/awk$ awk '/ghostwu/,/zhanzhao/ {print}' ghostwu.txt 
    ghostwu 20 man
    zhangsan 22
    lisi
    ghostwu 30 man
    zhanzhao 40 man

    当然,上面的例子,也可以用之前的内置变量NR,关系表达式模式实现更简单

    ghostwu@dev:~/linux/awk$ awk 'NR>=1 && NR<=5{print}' ghostwu.txt 
    ghostwu 20 man
    zhangsan 22
    lisi
    ghostwu 30 man
    zhanzhao 40 man

    4,关系运算符和正则搭配使用,匹配满足格式的网段

    ghostwu@dev:~/linux/awk$ cat host.txt 
    name    ip地址
    host1    192.168.1.1
    host2    192.177.81.1
    host3    10.0.0.5
    host4    192.168.3.98
    host5    192.168.3.98
    host6    192.168.9.254
    ghostwu@dev:~/linux/awk$ awk --re-interval '$2~/192.168.[0-9]{1,3}.[0-9]{1,3}/{print}' host.txt 
    host1    192.168.1.1
    host4    192.168.3.98
    host5    192.168.3.98
    host6    192.168.9.254

    $2:表示第2列, 他后面的~ 表示第二列与后面的正则表达式匹配结果为真,就执行action,这里就是打印当前行{print},如果加上! 就是取反

    ghostwu@dev:~/linux/awk$ awk --re-interval '$2!~/192.168.[0-9]{1,3}.[0-9]{1,3}/{print}' host.txt 
    name    ip地址
    host2    192.177.81.1
    host3    10.0.0.5

      

    关系运算符

    含义

    用法示例

    <

    小于

    x < y

    <=

    小于等于

    x <= y

    ==

    等于

    x == y

    !=

    不等于

    x != y

    >=

    大于等于

    x >= y

    >

    大于

    x > y

    ~

    与对应的正则匹配则为真

    x ~ /正则/

    !~

    与对应的正则不匹配则为真

    x !~ /正则/

    模式小结:

    >空模式

    >关系运算模式

    >正则模式

    >行范围模式

    >BEGIN/END模式

  • 相关阅读:
    Jmeter属性和变量
    用trie树解决最大异或对问题(On)
    trie树
    kmp算法
    数学归纳法
    单调栈和单调队列
    区间合并
    离散化
    位运算
    双指针算法
  • 原文地址:https://www.cnblogs.com/ghostwu/p/9095138.html
Copyright © 2020-2023  润新知