• Shel编程之awk


    1. awk工作模式

    awk是一个文本处理工具,通常用于处理数据并生成结果报告
    awk的命名来自它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母

    语法格式

    1. awk 'BEGIN{}pattern{commands}END{}' file
    2. standard output | awk 'BEGIN{}pattern{commands}END{}'
    语法格式 含义
    BEGIN{} 正式处理数据之前进行
    pattern 匹配模式
    {commands} 处理命令,可以多行
    END{} 处理完所有匹配数据后执行

    2. awk内置变量

    内置变量 含义
    $0 整行内容
    $1-$n 当前行的第1-n个字段
    NF 当前行的字段个数,也就是有多少列 Number Field
    NR 当前行的行号,从1开始计数。 Number Row
    FNR 多文件处理时,每个文件行号单独计算。 File Number Row
    FS 输入字段分隔符,不指定默认以tab或空格进行分隔 Filed Separator
    RS 输入行分隔符,默认回车换行 Row Separator
    OFS 输出字段分隔符,默认为空格
    ORS 输出行分隔符,默认为回车换行
    $ awk '{print $0}' passwd # print 打印命令 $0 代表整行输出
    $ awk 'BEGIN{FS=":"}{print $1}' passwd # print 打印命令 $1 代表分割后的第一列,指定分隔符为:
    nobody
    root
    daemon
    $ awk '{print $1}' demo.txt # 默认以空格或tab进行分割的
    $ awk '{print NF}' demo.txt # 内置变量直接写即可,不需要加$去引用
    

    3. 格式化输出

    格式符号 含义
    %s 打印字符串
    %d 打印十进制数
    %f 打印浮点数
    %x 打印十六进制数
    %o 打印八进制数
    %e 打印数字的科学记数法形式
    %c 打印单个字符的ASCII码
    $ awk 'BEGIN{FS=":"}{printf "%s
    ", $1}' passwd # 和print一样
    $ awk 'BEGIN{FS=":"}{printf "%s %s
    ", $1,$3}' passwd
    # 当指定位数后,默认使用右对齐, 如果不加入填充位数,默认右对齐
    $ awk 'BEGIN{FS=":"}{printf "%30s %20s
    ", $1,$7}' passwd # 填充位数,默认右对齐, 右对其使用 + 
                            nobody       /usr/bin/false
                              root              /bin/sh
                            daemon       /usr/bin/false
                             _uucp     /usr/sbin/uucico
    $ awk 'BEGIN{FS=":"}{printf "%-30s %-20s
    ", $1,$7}' passwd # 填充位数,左对齐, 左对齐使用 -
    nobody                         /usr/bin/false
    root                           /bin/sh
    daemon                         /usr/bin/false
    _uucp                          /usr/sbin/uucico
    $ awk 'BEGIN{FS=":"}{printf "%0.3f
    ", $3}' passwd  # 保留3位小数
    # 打印8进制或者18进制的时候显示前面的标识 %后面加上 # 即可
    $ awk 'BEGIN{FS=":"}{printf "%#x
    ", $3}' passwd  # #x 表示加入16进制的标识0x
    $ awk 'BEGIN{FS=":"}{printf "%#o
    ", $3}' passwd  # #o 表示加入16进制的标识0
    

    4. 匹配模式

    1. 第一种匹配模式:RegExp
    2. 第二种模式匹配:关系运算符
    语法格式 含义
    RegExp 按正则表达式进行匹配
    关系运算 按关系运算匹配
    $ awk 'BEGIN{FS=":"}/root/{print $0}' passwd # 包含root的行
    root:*:0:0:System Administrator:/var/root:/bin/sh
    daemon:*:1:1:System Services:/var/root:/usr/bin/false
    $ awk 'BEGIN{FS=":"}/^root/{print $0}' passwd # 以root开头的行
    root:*:0:0:System Administrator:/var/root:/bin/sh
    $ awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd #第7列是/bin/bash的匹配
    _mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
    $ awk 'BEGIN{FS=":"}$1=="root" || $1=="hdfs"{print $0}' passwd
    
    关系运算符 说明
    < 小于
    > 大于
    <= 小于等于
    >= 大于等于
    == 等于
    != 不等于
    ~ 匹配正则表达式
    !~ 不匹配正则表达式
    || 布尔运算 或
    && 布尔运算 与
    ! 布尔运算 非

    5. 表达式的使用

    运算符 说明
    +
    -
    *
    /
    % 取模
    ^或** 乘方
    ++x 在返回x变量之前, x加1
    x++ 返回x变量后,x加1
    $ awk 'BEGIN{var=2;var1="hello";print var,var1}'
    2 hello
    $ awk 'BEGIN{var=2;var1=3.5;print var+var1}'
    5.5
    $ awk '/^$/{sum++}END{print sum}' passwd # 统计空行的数量 sum 没有初始化赋值,默认为0
    $ awk '/root/{sum++}END{print sum}' passwd # 统计包含root的行的数量
    

    awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html

  • 相关阅读:
    mysql相关笔记
    qt杂项
    rpm离线安装整理
    linux fopen个数限制的问题(文件描述符限制)
    解决free():invalid pointer:0x00000000000000155455 ****的问题。
    linux c获取系统时间戳
    ubuntu QT Creater 安装
    LinkedHashMap如何保证顺序性
    HashMap原理(二) 扩容机制及存取原理
    HashMap原理(一) 概念和底层架构
  • 原文地址:https://www.cnblogs.com/itgiser/p/14533776.html
Copyright © 2020-2023  润新知