zoukankan      html  css  js  c++  java
  • awk文本处理

    awk文本处理
    基于模式匹配检查输入文本,逐行处理并输出
    通常用在shell脚本中,获取指定的数据
    单独用时,可对文本数据做统计

    一、语法格式
    格式1:命令 | awk [选项] '[条件]{编辑指令}'
    格式2:awk [选项] '[条件]{编辑指令}' 文件..
    若有多条语句,可用分号分隔
    print是最常用的指令

    # awk -F ";" '{print $1,$2}' /etc/passwd
    root x
    bin x
    .. ..

    二、常用命令选项
    -F:指定分隔符,可省略(默认空格或Tab位)
    cat m.txt
    11111111 Caremi
    222 IT Group

    #awk'{print $1}' m.txt
    11111111
    222
    #awk -F "r" '{print $1}' m.txt
    11111111 Ta
    222 IT G

    #df -hT /boot | tail -1 //第一行
    #df -hT /boot | tail -1 | awk '{print $6}' //第一行第六列

    # head -5 /etc/passwd | awk -F:(分隔符可以紧挨-F) '{print $1,$7}'

    三、awk内置变量
    FS 保存或设置字段分隔符,例如FS=":"
    $n 指定分隔的第n个字段,如$1、$3分别表示第1、3列
    $0 当前读入的整行文本内容
    NF 记录当前处理行的字段个数(列数)
    NR 记录当前已读入行的数量(行数)
    FNR 保存当前处理行在原文本内的序号(行号)

    #awk '{print "第"FNR"行","有"NF"列"}' m.txt
    #awk '{print "Last:"$NF}' m.txt //$NF表示每行最后一个字段
    #awk -F: '$1==ENVIRON["USER"]{print $3}'
    /etc/passwd //输出当前用户的UID信息
    四、awk处理的时机
    1.行前处理,BEGIN{}
    读入第一行文本之前的执行
    一般用来初始化操作
    2.逐行处理,{}
    逐行读入文本执行相应的处理
    是最常见的编辑指令块
    3.行后处理,END{}
    处理完最后一行文本之后执行
    一般用来输出处理结果

    1-3可单独使用,也可以一起使用

    #awk 'BEGIN {a=34;print a+12}' //预处理不需要数据文件
    #awk 'BEGIN{x=0}/<bash$/{x++}
    END{print x}' /etc/passwd //统计使用bash的用户个数
    #awk 'BEGIN{print NR}END{print NR}' m.txt //预处理时,行数为0
    //全部处理完以后,行数为已读入的行数
    五、awk处理条件
    1.条件的表现形式
    (1)正则表达式
    /正则表达式/
    ~ 匹配
    !~ 不匹配
    #awk -F:'/^ro/{print}' /etc/passwd //列出以ro开头的记录
    #awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
    //列出第7个字段不以bash结尾的用户名、登录shell
    (2)数值/字符串比较
    ==;!=;>;>=;<;<=
    cat reg.txt
    abcd XX
    XX
    abcabcd XX
    #awk 'NR==2{print}' reg.txt //XX
    #awk '$2!="XX"{print}' reg.txt //XX,输出第2列不是XX的行
    #awk 'NF>=2{print}' reg.txt //输出含2个及以上字段的行
    abcd XX
    abcabcd XX
    (3)逻辑比较
    &&:期望多个条件都成立;||:只要有一个条件成立即满足要求
    #awk -F:'$3>=0&&3<2{print $1,$3}'
    /etc/passwd //列出UID小于2的用户信息
    root 0
    bin 1

    #awk -F: '$3==1||$3==7{print $1,$3}'
    /etc/passwd //列出UID为1或7的用户信息
    bin 1
    halt 7
    (4)运算符
    +,-,*,/,%,++,--,+=,-=,*=,/=
    #awk 'NR%2==1{print}' reg.txt //输出奇数行文本
    abcd XX
    abcabcd XX

    #awk 'BEGIN{i=0}{i+=NF} END{print i}' reg.txt //统计文本的总字段个数
    5

    #seq 200 | awk 'BEGIN{i=0}{$0%3==0}&&
    {$0%13==0}{i++} END{print i}' //计算能同时被3和13整除的整数个数

  • 相关阅读:
    JS中的一些函数式编程术语
    学习RxJS:Cycle.js
    学习RxJS: 导入
    爬虫的终极形态:nightmare
    RxJS/Cycle.js 与 React/Vue 相比更适用于什么样的应用场景?
    [转]Shared——RN如何实现一个ExpandableList(可展开列表)组件
    Algorithm——ZigZag Conversion
    Review——RN视图缩放框架react-native-view-transformer解析
    Between Worlds 3 太阳与地球
    Tips——RN构造函数内绑定导致页面交互卡顿
  • 原文地址:https://www.cnblogs.com/alphain/p/10836169.html
Copyright © 2011-2022 走看看