• 5-1-5-shell:字符串处理进阶--awk篇


    处理过程: 

    依次对每一行进行处理,然后输出

    命令形式

    awk 参数 命令 文件
    awk [-F|-f|-v] 'BEGIN{} //{command1; command2} END{}'  file

    参数列表 [-F | -f | -v]

    -F 指定分隔符
    -f  指定使用脚本文件
    -v 定义变量

     DEMO:

    -F demo

    echo "aa bb cc" | awk -F" " '{print $2,$1,$3}'
    结果:"bb aa cc"
    echo -e "aa-bb#cc" |awk -F'[- #]' '{for (i=1;i<=NF;i++) print i" "$i;}'
    结果:
    "
    1 aa
    2 bb
    3 cc
    "

    -f demo

    command.file: {print $2,$1,$3}
    
    echo "aa bb cc" | awk -F" " -f command.file
    结果:"bb aa cc"

    -v demo

    echo "aa bb cc" | awk -F" " -v"a=22" '{print $2,a,$3}'
    结果:bb 22 cc

    命令详解

    符号标识

    '' 整个命令区间标识,双单引号包含区间
    {} 代码块区间标识,命令代码块,包含一条或多条命令
    ;  代码间分割标识,多条命令使用分号分隔
    echo "this is a test" |awk -F" " '{print $2; print $1;}'

    代码起始标识符

    BEGIN 后续跟代码块{},初始化代码,每一行处理前置,主要是引用全局变量,设置FS分隔符
    //    后续跟代码块{},匹配代码块,每一行处理过程,可以是字符串或正则表达式
    END   后续跟代码块{},结尾代码块,所有行处理后置,再执行的代码块,主要是进行最终计算或输出结尾摘要信息

    起始代码块

    echo -e "this is a test.
    he is a boy." |awk -F" " 'BEGIN{a="start--"} {print a" "$0" ";} END{print "--end."}'
    
    结果:
    "
    start-- this is a test. 
    start-- he is a boy. 
    --end.
    "

    匹配代码块

    符号 含义 样例 结果
    // 纯字符匹配 echo -e "aa-bb ac" |awk '/bb/ {print NR,$0}' 1 aa-bb
    !// 纯字符不匹配 echo -e "aa-bb ac" |awk '!/bb/ {print NR,$0}' 2 ac
    $i~// 字段值匹配 echo -e "aa-bb ac" |awk -F'-' '$1~/aa/ {print NR,$0}' 1 aa-bb
    $i!~// 字段值不匹配 echo -e "aa-bb ac" |awk -F'-' '$1!~/aa/ {print NR,$0}' 2 ac

     

    命令内符号详情

    特殊符号变量 

    符号 含义 样例 结果
    $0 整行数据 echo -e "aa-bb#cc" |awk -F'[- #]' '{print $0}' aa-bb#cc
    $1,$2 分割后第一个元素,第二个元素.. echo -e "aa-bb#cc" |awk -F'[- #]' '{print $1, $2}' aa bb
    NF 分割后元素个数 echo -e "aa-bb#cc" |awk -F'[- #]' '{print NF}' 3
    NR 每一行行号,多文件行号递增 echo -e "aa-bb cc" |awk -F'[- #]' '{print NR, $0}' 1 aa-bb
    2 cc
    FNR 每一行行号,多文件行号不递增    
    FS BEGIN内定义,解析一行是,输入分割符号 echo -e "aa-bb#cc" |awk 'BEGIN{FS="[-#]"} {print $1, $2}' aa bb
    RS BEGIN内定义,文件内输入一条记录分隔符号,默认为换行符  echo -e "aa-bb#cc" |awk 'BEGIN{RS="[#-]"} {print $0}' aa
    bb
    cc
    OFS BEGIN内定义,解析一行是,输出分割符号 echo -e "aa-bb#cc" |awk -F'[-#]' 'BEGIN{OFS="*"} {print $1,$2,$3}' aa*bb*cc
    ORS BEGIN内定义,文件内输出一条记录分隔符号,默认为换行符 echo -e "aa-bb cc" |awk -F'-' 'BEGIN{ORS="*"} {print $0}' aa-bb*
    cc*

    数值运算符

    + 
    -
    *
    /
    > 
    >=
    ==
    !=

    条件运算符

    if (a>10) print "1" else print "0";

    逻辑运算符

    && 
    ||
  • 相关阅读:
    Java并发(十八):阻塞队列BlockingQueue
    web前端
    python学习总结:目录
    Django -- 5.路由层(URLconf)_基于Django1
    python:linux下字符串转换为JSON
    python:一秒中启动一个下载服务器
    Flask【第十二章】:Flask之Websocket,建立单聊群聊
    Flask【第十一章】:Flask中的CBV以及偏函数+线程安全
    Flask【第十章】:特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler
    Flask【第九章】:Flask之蓝图
  • 原文地址:https://www.cnblogs.com/lamp-lrh/p/14678632.html
Copyright © 2020-2023  润新知