zoukankan      html  css  js  c++  java
  • 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";

    逻辑运算符

    && 
    ||
  • 相关阅读:
    容器云技术:容器化微服务,Istio占C位出道
    如何用istio实现请求超时管理
    技术进阶:Kubernetes高级架构与应用状态部署
    如何基于 K8S 多租能力构建 Serverless Container
    面试题目<转载>
    PHP面试出场率较高的题目<转载>
    命名规范
    字符串大小写转换(三种方法)
    php反转输出字符串(两种方法)
    获取文件名后缀的方法
  • 原文地址:https://www.cnblogs.com/lamp-lrh/p/14678632.html
Copyright © 2011-2022 走看看