zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹11 【嵌入式环境及基础】【Linux shell深入】【深入讨论】

    一、深入讨论awk
    1、条件操作符
    < >= <= == != 等符号在awk中都存在
    ~ 匹配正则表达式
    !~不匹配正则表达式

    2、逻辑操作符
    && || ! 也都是存在的

    3、awk内置变量
    ARGC  命令行参数个数
    ARGV  命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk浏览的文件名
    FNR 浏览文件的记录数
    FS  设置输入域分隔符,等价于命令行-F选项
    NF  浏览记录的域个数
    NR  已读的记录数
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS  控制记录分隔符

    终端实验代码

    #awk内置变量
    [root@localhost ~]# more grade.txt
    11#senior
    22#junior
    33#senior
    44#senior
    55#junior
    66#junior
    77#junior
    88#senior
    [root@localhost ~]# awk -F '#' '{print NF,NR,$0}' grade.txt
    2 1 11#senior
    2 2 22#junior
    2 3 33#senior
    2 4 44#senior
    2 5 55#junior
    2 6 66#junior
    2 7 77#junior
    2 8 88#senior
    [root@localhost ~]# awk '{print NF,NR,$0}' grade.txt
    1 1 11#senior
    1 2 22#junior
    1 3 33#senior
    1 4 44#senior
    1 5 55#junior
    1 6 66#junior
    1 7 77#junior
    1 8 88#senior
    [root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0}' grade.txt
    2 1 root 11#senior
    2 2 root 22#junior
    2 3 root 33#senior
    2 4 root 44#senior
    2 5 root 55#junior
    2 6 root 66#junior
    2 7 root 77#junior
    2 8 root 88#senior
    #
    #下面格式很有些奇怪。。求解释
    [root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0,FILENAME}' grade.txt
    grade.txt1#senior
    grade.txt2#junior
    grade.txt3#senior
    grade.txt4#senior
    grade.txt5#junior
    grade.txt6#junior
    grade.txt7#junior
    2 8 root 88#senior grade.txt
    [root@localhost ~]# awk -F '#' '{print NF,NR,ENVIRON["USER"],$0,FILENAME,ARGC}' grade.txt
    grade.txt 2senior
    grade.txt 2junior
    grade.txt 2senior
    grade.txt 2senior
    grade.txt 2junior
    grade.txt 2junior
    grade.txt 2junior
    2 8 root 88#senior grade.txt 2
    [root@localhost ~]# awk -F '#' '{print $0,FILENAME,ARGC,ARGV[0]}' grade.txt
    grade.txt 2 awk
    grade.txt 2 awk
    grade.txt 2 awk
    grade.txt 2 awk
    grade.txt 2 awk
    grade.txt 2 awk
    grade.txt 2 awk
    88#senior grade.txt 2 awk
    [root@localhost ~]# awk -F '#' '{print $0,FILENAME,ARGC,ARGV[1]}' grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    grade.txt 2 grade.txt
    88#senior grade.txt 2 grade.txt


    4、字符串函数

    gsub(r,s) 在整个$0中用s替代r
    gsub(r,s,t) 在整个t中用s替代r
    index(s,t) 返回s中字符串t的第一位置
    length(s) 返回s长度
    match(s,r) 测试s是否包含匹配r的字符串
    split(s,a,fs) 在fs上将s分成序列a
    sprint(fmt,exp) 返回经fmt格式化后的exp
    sub(r,s) 用$0中最左边最长的子串代替s
    substr(s,p) 返回字符串s中从p开始的后缀部分
    substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

    终端实验代码

    #字符串函数
    [root@localhost ~]# awk -F '#' '{print (index($2,"e"))}' grade.txt
    2
    0
    2
    2
    0
    0
    0
    2
    [root@localhost ~]# awk -F '#' '{print (index("e",$2))}' grade.txt
    0
    0
    0
    0
    0
    0
    0
    0
    [root@localhost ~]# awk -F '#' '{print (index($2,"s"))}' grade.txt
    1
    0
    1
    1
    0
    0
    0
    1
    [root@localhost ~]# cat grade.txt
    11#senior
    22#junior
    33#senior
    44#senior
    55#junior
    66#junior
    77#junior
    88#senior


    5、awk转义字符
    \" \"(双引号)标记
    \/ /(斜杠)字符
    \ ddd 其编码由 1、2 或 3 位八进制整数表示的字符,其中 d 表示一个八进制数位
    \\ \ ( 反斜杠 ) 字符
    \a 警告字符
    \b 退格字符
    \f 换页字符
    \n 换行字符(请参阅以下的注)
    \r 回车字符
    \t 跳格字符
    \v 垂直跳格

    6、printf修饰符
    这个跟c语言很像,估计c就是从这里学的。。。
    %c ASCII字符
    %d 整数
    %e 浮点数,科学计数法
    %f 浮点数
    %g awk决定使用那种浮点数转换e或者f
    %o 八进制
    %s 字符串
    %x 十六进制

    7、awk数组
    数组初始为空且它们大小可动态更改。数组由一个变量和在 [ ](方括号)中的下标来表示。下标或元素标识符可以是几个字符串,它们提供了一种相关数组能力。例如,程序:
    /red/ { x["red"]++ }
    /green/ { y["green"]++ }
    增加 red 计数器和 green 计数器的计数。

    数组可以用一个以上的下标来建立索引,类似于一些编程语言中的多维数组。因为 awk 命令的编程数组实际上是一维的,通过串联各独立表达式的字符串值(每个表达式由 SUBSEP 环境变量的值隔开)来将以逗号隔开的下标转换为单个字符串。所以,以下两个索引操作是等同的:
    x[expr1, expr2,...exprn]

    x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

    当使用 in 运算符时,一个多维 Index 值应包含在圆括号之中。除了 in 运算符,任何对不存在数组元素的引用将自动创建该元素。

    终端实验代码

    #数组
    [root@localhost ~]# awk 'BEGIN {print split("as#qw#1234",array2,"#")}'
    3
    [root@localhost ~]# awk 'BEGIN {print split("as#qw#1234",array2,"#");print array2[1]}'
    3
    as
    [root@localhost ~]# awk 'BEGIN {split("as#qw#1234",array2,"#");print array2[1],"\t",array2[2],"\t",array[3]}'
    as qw
    [root@localhost ~]# awk 'BEGIN {split("as#qw#1234",array2,"#");print array2[1],"\t",array2[2],"\t",array2[3]}'
    as qw 1234


    awk脚本例子
    不知道为什么没有按我想象的输出,senior和junior都是0.。。

    View Code
     1 #!/bin/awk -f
    2 #awk_array.sh
    3
    4 BEGIN{
    5 FS="#"
    6 score["0-60"]=0
    7 score["60-70"]=0
    8 score["70-80"]=0
    9 score["80-90"]=0
    10 score["90-100"]=0
    11 student["junior"]=0
    12 student["senior"]=0
    13 }
    14
    15 {
    16 {if($1<60)
    17 score["0-60"]++
    18 }
    19 {if($1<70 && $1>=60)
    20 score["60-70"]++
    21 }
    22 {if($1<80 && $1>=70)
    23 score["70-80"]++
    24 }
    25 {if($1<90 && $1>=80)
    26 score["80-90"]++
    27 }
    28 {if($1<=100 && $1>=90)
    29 score["90-100"]++
    30 }
    31 }
    32 #我觉得是数据中的回车影响了输出
    33 {
    34 for(senior_junior in student)
    35 {
    36 if($2==senior_junior)
    37 #{
    38 #print $1,"\t",$2
    39 student[seniot_junior]++
    40 #}
    41 }
    42 }
    43 #注意for外加括号
    44 END{
    45 {for(number in score) print "The score",number,"has",score[number],"students"}
    46 {for (senior_junior in student) print "The class has",student[senior_junior],senior_junior,"students"}
    47 }

    二、深入讨论<<

    典型用法:菜单输出
    可以减轻程序员的工作量

    脚本例子

     1 #!/bin/bash
    2
    3 loopvar=2
    4
    5 ###########
    6 #main menu#
    7 ###########
    8
    9 main_menu()
    10 {
    11 echo
    12 echo
    13 dis_mainmenu="CREATE MINISITE"
    14 curdate=`date "+%Y-%m-%d %T"`
    15 cat <<mayday
    16 DATE: $curdate
    17 ========================================
    18 $dis_mainmenu
    19 ========================================
    20 **
    21 ** 7) EXIT **
    22 ========================================
    23 mayday
    24 }
    25
    26 while [ $loopvar -gt 0 ]
    27 do
    28 main_menu
    29 echo -n " Please choose [1-7]:"
    30 read choose
    31 case $choose in
    32 7)
    33 exit
    34 ;;
    35 *)
    36 clear
    37 continue
    38 ;;
    39 esac
    40 done
  • 相关阅读:
    单例模式 异常抛出
    「分块系列」数列分块入门7 解题报告
    「分块系列」数列分块入门4 解题报告
    「分块系列」数列分块入门5 解题报告
    「分块系列」数列分块入门6 解题报告
    「分块系列」数列分块入门3 解题报告
    「分块系列」数列分块入门2 解题报告
    「分块系列」数列分块入门1 解题报告
    「黑科技」查错神器——对拍
    「洛谷P1196」「NOI2002」银河英雄传说 解题报告
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2382481.html
Copyright © 2011-2022 走看看