zoukankan      html  css  js  c++  java
  • shell脚本之awk

    AWK

    1、AWK介绍
    全称:Aho Weinberger kernaighan 三个人的首字母缩写
    1970 年第一次出现在Unix机器上,后面再开源领域使用它;
    所以,我们在Linux中使用,改用GUN AWK;所以,在Linux上实际上叫做gawk;

    grep 行过滤器
    -o -i -v -e grep egrep fgrep
    sed 流编辑器
    -n p 1、地址定界 3,5 3行到5行 2、sed的命令 p打印 a i w c s/pattern/str支持正则表达式匹配
    AWK 报告生成器
    通过默认匹配以及自身的语言格式
    [默认情况下,三个工具都不支持编辑源文件]
    2、AWK原理

    3、AWK用法
    AWK 【option】`awk自己的固定语法语句` FILE……
    AWK [option] ...|`program` FILE
    1、program 必须使用单引号 ``
    2、多条program 语句使用大括号包含起来,可以并列,可以嵌套
    awk`{print}` /etc/passwd
    4、option
    -F 指定分隔符
    AWK -F [/:] `{print $1,$3} a.txt`
    其中【】 内表示多个字符中的1任意一个
    -v 因为AWK是一种语言编译器,能自己定义变量,同时也有内置变量(与环境变量类似)
    手动指定变量参数
    awk -v a="a/b" `{print a}` a.txt
    给a赋值,打印a这个变量
    1、a是自定义变量 -v FS=":"
    2、在awk中调用变量,不用加$符号
    5、AWK自己的固定语法
    1、print
    默认输出(在屏幕上)
    在awk中没有保存命令,我们可以关联别的命令来保存awk的结果
    awk `{a="a/b";print a}` a.txt|tee a.bak
    2、printf-----格式化输出
    printf “%s是%d班学的最好的学生”,变量1,变量2
    【仅仅只有顺序关系】
    格式符
    %s字符串
    %d %i数值
    %i数值
    %E科学计数法
    %cASC||码值
    %f浮点数
    %u无符号整数
    %%逃逸符 只显示%自己
    %

    修饰符
    默认为右对齐
    -代表左对齐
    %5.4f
    5 所占位符
    4 所去小数位

    sed 、pATH/PATH2/

    3、变量(内置变量、自定义变量
    内置变量--环境变量(bash)(env set -C +C)
    awk 语言所默认支持的变量
    FS 定义输入分隔符的变量
    OFS 定义输出分隔符的变量
    NF 定义分隔以后的参数个数($NF 分隔以后最后一行变量)
    *变量引用的时候,不加$,$1....$n
    awk `{print NR}` /etc/fstab /etc/passwd
    awk `{print FNR}` /etc/fstab /etc/passwd
    存储文件的名字
    awk `{print FILENAME}`/etc/passwd
    awk `{print FILENAME}` /etc/passwd
    ARGC 整个命令的段数 【注意:数组中不包含‘program’本身】
    ARGV 数组 用来调取命令中,指定的ARGC的字段
    RS 指定换行符 可以指定新的换行符,不影响本身的换行
    ORS 输出的时候指定的换行符,默认换行符指定默认字符
    awk -v RS =""{print}
    4、模式匹配(地址定界)
    1、空值,没有定义,默认就将文件中所有的行,放入awk进行循环
    2、对固定的1、3行进行操作
    sed -n `1,3p`/etc/passwd
    awk `1,3{print}` /etc/passwd ?/?默认不支持使用1-3,1,3等等,这样数值的直接写法;
    awk `NR>=1&&<=3;{print}` /etc/passwd
    3、/pattern/,/
    sed /pat1/p /etc/passwd
    awk '/r..ter/{print}' /etc/passwd
    4、/pat1/./pat2 第一次匹配Pat1到Pat2的
    5、模式匹配可以直接使用判断语句
    awk -F :'$NF=="/bin/bash"{print $1,$3}'/etc/passwd
    6、BIGEIN|END 语句
    BIGEIN定义在默认循环进行操作前所要执行的语句;
    awk -F:'BEGIN{printf“shell程序为bash的用户为: ”}$NF=="/bin.bash"{print $1,$3}' /etc/passwd
    awk -F:'BEGIN{printf“shell程序为bash的用户为: ”}$NF=="/bin.bash"{print $1,$3}'END{print "end"} /etc/passwd

    5、操作符
    运算操作符:
    +-*/ %(取余、取模)** //(取整)
    比较运算符:
    == ! = <> =<=
    ~!~
    逻辑操作符:
    &&
    ||
    !
    赋值运算:
    = += -= /= *= %= ^= //=
    条件表达式:
    条件语句? 条件成立语句;条件不成立语句
    awk '/^title/{FN<=2? print;printf"参数 "}' /boot/grub/grub.conf

    6、常见(action)
    print printf 以及它任何命令的操作都是action
    1、expressions
    2、control statement 控制语句 例如:if while
    逻辑关系语句判断来进行结和
    3、语句组合 compound statements

    4、Input statements 输入语句
    5、output statements 输出语句

    7、常见语言(if while do for break continue delete switch)
    1、if语句
    语法格式:if(条件表达式){执行语句}
    if (条件表达式){执行语句}else{执行语句}
    awk ‘/^title/{if(Fn<=2){print}else{print " 参数过少"}}’/boot/grub/grub.conf
    awk '/^title/{if(NF>=2) print $4}' /boot/grub/grub.conf
    2、while
    只有对参数进行遍历的时候才会使用循环;
    例题:awk '/^[[:space:]]*kernel>/{print}' grub.conf
    语法格式:
    只有对行参数进行
    3、for语句
    语法格式:for(初始值;条件判断;初始值控制语句){循环体}
    awk '/^[:space:]]*kernel>/{for(i=0;i<=NF;i++){print $i" ";print length($i)}}' grub.conf
    循环建议用for循环
    在awk中,for也可以使用和shell中一样的格式:
    回顾:
    for (i in 列表){循环体}
    echo "wsl is good boy" | awk 'for i in{$i}'
    例题:

    4、do -while 循环
    语法:do {循环体} while (循环条件)
    注意和while的区别:while语句只有在满足条件的时候,才会进入循环,而do while 会先执行循环体一次,在进行判断;
    5、循环跳出语句
    break 【n】跳出n次循环
    continue 跳出本次循环
    next 跳出默认的当次循环
    NR%2==1 next
    awk `{if(NR%2==1){else {print}}}` /etc/passwd
    6、switch 类似于case
    语法格式:switch (expression){caseVALUE1 or /REGXP/: statement;case VALUE2 or /REGEXP2/:statement;……default;statemwnt}
    switch(表达式){case 模式匹配值:执行语句;case模式值:执行语句;case模式匹配值:执行语句,}
    8、数组
    在awk中,数组和shell中数组特性相同
    注意:awk中数组不用定义,只要使用了,就有值为空的默认数组;这样做数据统计的时候非常常见!!!!!!
    行遍历---实际上就是整个文件的遍历
    列遍历---取对象固定某列的中的,相同数据的统计。

    注意:数组通过for语句,在给其他变量进行赋值的时候,赋值的index索引信息;
    练习:
    awk '{for (i=1;i<=N;i++){count[4i++]}}end{for(i in count){print 1,count[i]}}' /etc/fstab

    9、函数
    1、内置函数:
    函数调用:function(参数)
    length($1)
    数学运算上使用的函数 sin()cos()cot()tan()
    sub(x,x,x)替换第一个匹配到的值
    gsub(x,x,x)替换该行所匹配到的所有值
    split(x,x,x)指定分隔符去切割文件。
    ---------------------------------------------------------------------------------------------------------------------

    chroot 

    切换系统目录
    /--/dev/sda1
    原来的操作系统的shell程序切换到一个新的目录下面去,然后再在这个目录下面放置相应系统启动需要的程序文件。
    拓展:
    虚拟化准备知识:系统的启动原理
    读取系统--读取磁盘:前提就是必须现价载磁盘的驱动程序
    挂载 虚拟根(img虚根文件ramdisk)
    虚根文件文件挂上以后,在grub1.4
    通过chroot将ramdisk 上面的临时“根”切换到磁盘上面

    ···················································································································

  • 相关阅读:
    数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】
    设备树网址【原创笔记】
    clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别【转】
    ajaxFileUpload SyntaxError: syntax error
    工厂模式
    程序猿都是project师吗?
    [android开发之内容更新类APP]二、这几日的结果
    Java实现将指定目录内的指定类型的文件归类
    移动支付之智能IC卡与Android手机进行NFC通信
    Java并发框架——AQS堵塞队列管理(一)——自旋锁
  • 原文地址:https://www.cnblogs.com/wangshilin/p/11397835.html
Copyright © 2011-2022 走看看