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";

    逻辑运算符

    && 
    ||
  • 相关阅读:
    JAVA共通関数文字列の長さを求める
    JAVA共通関数文字コード変換
    JAVA共通関数文字列に空白を追加する
    JAVA共通関数 半角英数字チェック
    JAVA共通関数項目が半角09か判断する
    JAVA共通関数 指定日の曜日を算出する
    linux添加静态路由(rhel5.4)
    ubuntu编译opencapwap报错解决
    Wireshark网络抓包(二)——过滤器
    net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse回收tcp连接总结
  • 原文地址:https://www.cnblogs.com/lamp-lrh/p/14678632.html
Copyright © 2011-2022 走看看