• Shell 编程 编辑工具 awk


    CentOS-Logo

    本篇主要写一些shell脚本编辑工具awk的使用。


    概述

    awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。

    awk倾向于将一行分成多个字段然后再进行处理,且默认情况下字段的分隔符为空格或者tab键。awk执行结果可以通过print的功能将字段数据打印显示。

    可以使用逻辑操作符&&,表示||表示!表示;还可以进行简单的数学运算,如+-*/%^分别表示取余乘方

    命令常见用法

    • 命令有两种格式:
    awk [选项] '模式或条件{编辑指令}' 文件 1 文件 2...
    awk -f 脚本文件 文件 1 文件 2...
    
    • 常见的内置变量

    FS:指定每行文本的字段分隔符,默认为空格或制表位。
    NF:当前处理的行的字段个数。
    NR:当前处理的行的行号(序数)。
    $0:当前处理的行的整行内容。
    $n:当前处理行的第n个字段(第n列)。
    RS:数据记录分隔,默认为 ,即每行为一条记录。
    FILENAME:被处理的文件名。

    示例

    按行输出文本

    • 输出所有内容
    [root@localhost ~]# awk '{print}' /etc/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:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    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-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    
    [root@localhost ~]# awk '{print $0}' /etc/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:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    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-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    
    • 输出第1~3
    [root@localhost ~]# awk 'NR==1,NR==3{print}' /etc/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
    
    [root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' /etc/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
    
    [root@localhost ~]# awk 'NR>=1&&NR<=3{print}' /etc/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
    
    • 输出第1行,第3
    [root@localhost ~]# awk '(NR==1)||(NR==3){print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    [root@localhost ~]# awk 'NR==1||NR==3{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    • 输出所有奇数行
    [root@localhost ~]# awk '(NR%2)==1{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    
    • 输出所有偶数行
    [root@localhost ~]# awk '(NR%2)==0{print}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    halt:x:7:0:halt:/sbin:/sbin/halt
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    
    • 输出以root开头的行
    [root@localhost ~]# awk '/^root/{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    • 输出以/bin/bash结尾的行
    [root@localhost ~]# awk '//bin/bash$/{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    • 统计以/bin/bash结尾的行数
    [root@localhost ~]# awk 'BEGIN{x=0};//bin/bash$/{x++};END{print x}' /etc/passwd
    1
    
    [root@localhost ~]# grep -c '/bin/bash$' /etc/passwd
    1
    [root@localhost ~]# grep '/bin/bash$' /etc/passwd | wc -l
    1
    
    • 统计以:分隔的文本段落数
    [root@localhost ~]# awk 'BEGIN{RS=":"};END{print NR}' /etc/passwd
    115
    

    按字段输出文本

    • 输出每行中的第3个字段
    [root@localhost ~]# awk -F":" '{print $3}' /etc/passwd
    0
    1
    2
    3
    4
    5
    6
    7
    8
    11
    12
    14
    99
    192
    81
    999
    89
    74
    998
    
    • 输出每行中的第13个字段
    [root@localhost ~]# awk -F":" '{print $1,$3}' /etc/passwd
    root 0
    bin 1
    daemon 2
    adm 3
    lp 4
    sync 5
    shutdown 6
    halt 7
    mail 8
    operator 11
    games 12
    ftp 14
    nobody 99
    systemd-network 192
    dbus 81
    polkitd 999
    postfix 89
    sshd 74
    chrony 998
    
    • 输出UID0的用户记录
    [root@localhost ~]# awk -F":" '$3=="0"{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    [root@localhost ~]# awk 'BEGIN{FS=":"};$3=="0"{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    • 输出第7个字段包含/bin/bash的行的第1个字段
    [root@localhost ~]# awk -F":" '$7~"/bin/bash"{print $1}' /etc/passwd
    root
    
    • 输出第1个字段包含sshd且包含7个字段的行中第137个字段
    [root@localhost ~]# awk -F":" '($1~"sshd")&&(NF==7){print $1,$3,$7}' /etc/passwd
    sshd 74 /sbin/nologin
    
    • 输出第7个字段既不是/bin/bash也不是/sbin/nologin的所有行
    [root@localhost ~]# awk -F":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    

    管道、双引号调用 shell 命令

    • 使用wc -l统计使用bash的用户个数
    [root@localhost ~]# awk -F":" '/bash$/{print | "wc -l"}' /etc/passwd
    1
    
    • 调用w命令,并统计在线用户数
    [root@localhost ~]# awk 'BEGIN{while("w" | getline)n++;{print n-2}}'
    1
    
    • 调用hostname,并输出当前主机名
    [root@localhost ~]# awk 'BEGIN{"hostname" | getline;print $0}'
    localhost
    
  • 相关阅读:
    windows7修改双系统启动项名称、先后顺序、等待时间
    windows初始化后做了哪些事情
    我的wordpress插件总结
    分析MySQL慢日志(转)
    在Java中使用Memcached(转)
    memcached应用场景(转)
    memcached简介(转)
    Linux下memcache的安装和启动(转)
    列式数据库
    Android测试(一):在Android中测试App
  • 原文地址:https://www.cnblogs.com/llife/p/11682017.html
Copyright © 2020-2023  润新知