zoukankan      html  css  js  c++  java
  • shell编程系列14--文本处理三剑客之awk的概述及常用方法总结

    shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
    
    
    awk是一个文本处理工具,通常用于处理数据并生成结果报告
    awk的命名是它的创始人 Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首个字母组成的
    
    awk的工作模式
    
    语法格式
    
    第一种形式: awk 'BEGIN{}pattern{commands}END{}' file_name
    
    BEGIN在匹配之前就执行的操作,pattern{commands}是对每一行的操作,END是匹配完后的操作
    
    第二种形式: standard output | awk 'BEGIN{}pattern{commands}END{}'
    
    
    语法格式说明
    
    语法格式        说明
    BEGIN{}        正式处理数据之前执行
    pattern        匹配模式
    {commands}    处理命令,可能多行
    END{}        处理完所有匹配数据后执行
    
    awk的内置变量
    
    内置变量对照表(上)
    
    内置变量    含义
    $0        整行内容
    $1-$n        当前行的第1-n个字段
    NF        当前行的字段个数,也就是多少列
    NR        当前的行号,从1开始计数
    FNR        多文件处理时,每个文件行号单独计数,都是从0开始
    FS        输入字段分隔符。不指定默认以空格或tab键分割
    RS        输入行分隔符。默认回车换行
    OFS        输出字段分隔符。默认为空格
    ORS        输出行分隔符。默认为回车换行
    
    内置变量对照表(下)
    
    内置变量    含义
    FILENAME    当前输入的文件名字
    ARGC        命令行参数个数
    ARGV        命令行参数数组
    
    总结:
        内置变量:
            $0                    打印行所有信息
            $1~$n                    打印行的第1到n个字段信息
            NF Number Field                处理行的字段个数
            NR Number Row                处理行的行号
            FNR File Number Row            多文件处理时,每个文件单独记录行号
            FS Field Separator            字段分隔符,不指定时默认以空格或tab键分割
            RS Row Separator            行分隔符,不指定时以回车换行分割
            OFS Output Filed Separator        输出字段分隔符
            ORS Output Row Separator        输出行分隔符
            FILENAME                处理文件的文件名
            ARGC                    命令行参数个数
            ARGV                    命令行参数数组
    
    
    # 输出整行数据
    
    [root@localhost shell]# awk '{print $0}' 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:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    ajie:x:1000:1000:ajie:/home/ajie:/bin/bash
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    deploy:x:1001:1001::/home/deploy:/bin/bash
    nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    
    # FS指定分隔符
    [root@localhost shell]# awk 'BEGIN{FS=":"}{print $1}' passwd 
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    games
    ftp
    nobody
    systemd-network
    dbus
    polkitd
    sshd
    postfix
    ajie
    chrony
    deploy
    nginx
    
    # 默认以空格或者tab为分隔符
    [root@localhost shell]# cat list
    Hadoop Spark Flume
    Java Python Scala
    Allen Mike Meggie
    [root@localhost shell]# awk '{print $1}' list
    Hadoop
    Java
    Allen
    [root@localhost shell]# awk 'BEGIN{FS=" "}{print $1}' list
    Hadoop
    Java
    Allen
    
    # NF 输出每一行的字段个数
    [root@localhost shell]# cat list
    Hadoop Spark Flume
    Java Python Scala Golang
    Allen Mike Meggie
    [root@localhost shell]# awk '{print NF}' list
    3
    4
    3
    
    # NR 行号,处理多个文件(list,passwd,/etc/fstab)时行号累加
    [root@localhost shell]# awk '{print NR}' list passwd /etc/fstab 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    # FNR在处理两个文件以上时会单独计数
    [root@localhost shell]# awk '{print FNR}' list passwd /etc/fstab 
    1
    2
    3
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    
    [root@localhost shell]# cat list
    Hadoop|Spark:Flume
    Java|Python:Scala:Golang
    Allen|Mike:Meggie
    
    # 以 | 符号分隔列
    [root@localhost shell]# awk 'BEGIN{FS="|"}{print $2}' list
    Spark:Flume
    Python:Scala:Golang
    Mike:Meggie
    # 以 : 符号分隔列
    [root@localhost shell]# awk 'BEGIN{FS=":"}{print $2}' list
    Flume
    Scala
    Meggie
    
    # RS 指定行分隔符: --
    [root@localhost shell]# cat list
    Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
    [root@localhost shell]# awk 'BEGIN{RS="--"}{print $0}' list
    Hadoop|Spark|Flume
    Java|Python|Scala|Golang
    Allen|Mike|Meggie
    
    [root@localhost shell]# awk 'BEGIN{RS="--";FS="|"}{print $3}' list 
    Flume
    Scala
    Meggie
    
    # ORS输出分隔符,以&连接各输出行
    [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list
    Flume&Scala&Meggie
    
    # 字段默认分隔符是空格
    [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $1,$3}' list
    Hadoop Flume&Java Scala&Allen Meggie
    &
    
    # OFS 指定字段分隔符为 : 
    [root@localhost shell]# awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list
    Hadoop:Flume&Java:Scala&Allen:Meggie
    &
    
    # FILENAME 文件名
    [root@localhost shell]# awk '{print FILENAME}' list
    list
    
    # 输出3次文件名list,是因为没有输入匹配模式 awk默认是行处理,文本有3行,处理三次会有3次输出
    [root@localhost shell]# cat list
    Hadoop|Spark|Flume--Java|Python|Scala|Golang--Allen|Mike|Meggie
    Test File
    Line
    [root@localhost shell]# awk '{print FILENAME}' list
    list
    list
    list
    
    # ARGC命令行参数个数
    [root@localhost shell]# awk '{print ARGC}' list
    2
    2
    2
    [root@localhost shell]# awk '{print ARGC}' list /etc/fstab 
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    
    # NF表示字段个数,NF=7 $NF 就是$7 表示最后一个字段
    [root@localhost shell]# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd 
    /bin/bash
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /bin/sync
    /sbin/shutdown
    /sbin/halt
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /bin/bash
    /sbin/nologin
    /bin/bash
    /sbin/nologin
  • 相关阅读:
    如何用VSCode手动编译Ace Editor
    libuv源码分析
    二叉平衡查找树---红黑树
    tcp滑动窗口与拥塞控制
    ceph架构剖析
    腾讯面试总结
    协程的实现原理
    dhcp协议交互报文
    libuv源码分析前言
    Protobuf使用规范分享
  • 原文地址:https://www.cnblogs.com/reblue520/p/10984717.html
Copyright © 2011-2022 走看看