码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【linux命令讲解大全】051.Linux Awk脚本语言中的字段定界符和流程控制


    文章目录

    • 设置字段定界符
      • 流程控制语句
        • 条件判断语句
        • 循环语句
          • while语句
          • for循环
          • do循环
        • 其他语句
      • 数组应用
        • 数组的定义
        • 读取数组的值
        • 数组相关函数
        • 二维、多维数组使用
    • 从零学 `python`

    设置字段定界符

    默认的字段定界符是空格,可以使用-F “定界符” 明确指定一个定界符:

    awk -F: '{ print $NF }' /etc/passwd
    # 或
    awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd
    
    • 1
    • 2
    • 3

    在BEGIN语句块中则可以用OFS=“定界符”设置输出字段的定界符。

    流程控制语句

    在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。

    条件判断语句

    if(表达式)
      语句1
    else
      语句2
    
    • 1
    • 2
    • 3
    • 4

    格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为:

    if(表达式)
      {语句1}
    else if(表达式)
      {语句2}
    else
      {语句3}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    示例:

    awk 'BEGIN{
    test=100;
    if(test>90){
      print "very good";
      }
      else if(test>60){
        print "good";
      }
      else{
        print "no pass";
      }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出:

    very good
    
    • 1

    每条命令语句后面可以用; 分号 结尾。

    循环语句

    while语句
    while(表达式)
      {语句}
    
    • 1
    • 2

    示例:

    awk 'BEGIN{
    test=100;
    total=0;
    while(i<=test){
      total+=i;
      i++;
    }
    print total;
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出:

    5050
    
    • 1
    for循环

    for循环有两种格式:

    格式1:

    for(变量 in 数组)
      {语句}
    
    • 1
    • 2

    示例:

    awk 'BEGIN{
    for(k in ENVIRON){
      print k"="ENVIRON[k];
    }
    
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    TERM=linux
    G_BROKEN_FILENAMES=1
    SHLVL=1
    pwd=/root/text
    ...
    logname=root
    HOME=/root
    SSH_CLIENT=192.168.1.21 53087 22
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注:ENVIRON是awk常量,是子典型数组。

    格式2:

    for(变量;条件;表达式)
      {语句}
    
    • 1
    • 2

    示例:

    awk 'BEGIN{
    total=0;
    for(i=0;i<=100;i++){
      total+=i;
    }
    print total;
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出:

    5050
    
    • 1
    do循环
    do
    {语句} while(条件)
    
    • 1
    • 2

    例子:

    awk 'BEGIN{ 
    total=0;
    i=0;
    do {total+=i;i++;} while(i<=100)
      print total;
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    5050
    
    • 1

    其他语句

    • break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。
    • continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。
    • next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。
    • exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。

    数组应用

    数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。

    数组的定义

    数字做数组索引(下标):

    Array[1]="sun"
    Array[2]="kai"
    
    • 1
    • 2

    字符串做数组索引(下标):

    Array["first"]="www"
    Array"[last"]="name"
    Array["birth"]="1987"
    
    • 1
    • 2
    • 3

    使用中print Array[1]会打印出sun;使用print Array[2]会打印出kai;使用print[“birth”]会得到1987。

    读取数组的值

    { for(item in array) {print array[item]}; }       #输出的顺序是随机的
    { for(i=1;i<=len;i++) {print array[i]}; }         #Len是数组的长度
    
    • 1
    • 2

    数组相关函数

    得到数组长度:

    awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'
    
    • 1

    输出:

    4 4
    
    • 1

    length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。

    awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'
    
    • 1

    输出:

    4
    
    • 1

    asort对数组进行排序,返回数组长度。

    输出数组内容(无序,有序输出):

    awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
    
    • 1

    输出:

    4 test
    1 it
    2 is
    3 a 
    
    • 1
    • 2
    • 3
    • 4

    for…in输出,因为数组是关联数组,默认是无序的。所以通过for…in得到是无序的数组。如果需要得到有序数组,需要通过下标获得。

    awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
    
    • 1

    输出:

    1 it
    2 is
    3 a
    4 test
    
    • 1
    • 2
    • 3
    • 4

    注意:数组下标是从1开始,与C数组不一样。

    判断键值存在以及删除键值:

    错误的判断方法:

    awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' 
    
    • 1

    输出:

    no found
    a a1
    b b1
    c
    
    • 1
    • 2
    • 3
    • 4

    以上出现奇怪问题,tB[“c”]没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。

    正确判断方法:

    awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'  
    
    • 1

    输出:

    a a1
    b b1
    
    • 1
    • 2

    if(key in array)通过这种方法判断数组中是否包含key键值。

    删除键值:

    awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'                     
    
    • 1

    输出:

    b b1
    
    • 1

    delete array[key]可以删除,对应数组key的,序列值。

    二维、多维数组使用

    awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4]=1这样的访问是允许的。awk使用一个特殊的字符串SUBSEP(�34)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。

    类似一维数组的成员测试,多维数组可以使用if ( (i,j) in array)这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用for ( item in array )这样的语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量。

    awk 'BEGIN{
    for(i=1;i<=9;i++){
      for(j=1;j<=9;j++){
        tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];
      }
    }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出:

    1 * 1 = 1
    1 * 2 = 2
    1 * 3 = 3
    1 * 4 = 4
    1 * 5 = 5
    1 * 6 = 6 
    ...
    9 * 6 = 54
    9 * 7 = 63
    9 * 8 = 72
    9 * 9 = 81
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以通过array[k,k2]引用获得数组内容。

    另一种方法:

    awk 'BEGIN{
    for(i=1;i<=9;i++){
      for(j=1;j<=9;j++){
        tarr[i,j]=i*j;
      }
    }
    for(m in tarr){
      split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m];
    }
    }'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从零学 python

    【从零学习python 】92.使用Python的requests库发送HTTP请求和处理响应
    【从零学习python 】91. 使用装饰器和字典管理请求路径的简洁Web应用
    【从零学习python 】93.使用字典管理请求路径
    【从零学习python 】89. 使用WSGI搭建简单高效的Web服务器
    【从零学习python 】88. WSGI接口详解:实现简单高效的Web开发
    【从零学习python 】87. 手动搭建HTTP服务器的Python实现及多线程并发处理
    【从零学习python 】86. 深入了解HTTP协议及其在浏览器和服务器通信中的作用
    【从零学习python 】85.Python进程池的并行计算技术应用
    【从零学习python 】84.深入理解线程和进程
    【从零学习python 】83. Python多进程编程与进程池的使用
    【从零学习python 】82. 基于多线程的聊天程序实现
    【从零学习python 】81.Python多线程通信与队列的应用
    【从零学习python 】80.线程访问全局变量与线程安全问题
    【从零学习python 】79. 线程访问全局变量与线程安全问题
    【从零学习python 】78. 文件下载案例
    【从零学习python 】77. TCP服务端编程及注意事项
    【从零学习python 】76.服务器与客户端:网络通信的关键组成部分
    【从零学习python 】75. TCP协议:可靠的面向连接的传输层通信协议
    【从零学习python 】74. UDP网络程序:端口问题与绑定信息详解
    【从零学习python 】73. UDP网络程序-发送数据
    【从零学习python 】72. 深入理解Socket通信及创建套接字的方法
    【从零学习python 】71. 网络端口及其作用
    【从零学习python 】70.网络通信方式及其应用:从直接通信到路由器连接多个网络
    【从零学习python 】69. 网络通信及IP地址分类解析
    【从零学习python 】68. Python正则表达式中的贪婪和非贪婪模式
    【从零学习python 】67.Python中的re模块:正则替换与高级匹配技术
    【从零学习python 】66.深入了解正则表达式:模式匹配与文本处理的利器
    【从零学习python 】65. Python正则表达式修饰符及其应用详解
    【从零学习python 】64. Python正则表达式中re.compile方法的使用详解
    【从零学习python 】63.正则表达式中的re.Match类及其属性和方法介绍
    【从零学习python 】62. Python正则表达式:强大的字符串匹配工具
    【从零学习python 】61.Python中的property属性详解和应用示例
    【从零学习python 】60.探索生成器:迭代的灵活利器
    【从零学习python 】59.迭代器:优化数据遍历的高效工具
    【从零学习python 】58.Python中的自定义异常及引发异常的方法
    【从零学习python 】57.Python中使用with关键字正确关闭资源
    【从零学习python 】56. 异常处理在程序设计中的重要性与应用
    【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
    【从零学习python 】54. 内存中写入数据
    【从零学习python 】53. CSV文件和Python的CSV模块
    【从零学习python 】52.文件的读写 - Python文件操作指南
    【从零学习python 】51.文件的打开与关闭及其在Python中的应用
    【从零学习python 】49. Python中对象相关的内置函数及其用法
    【从零学习python 】48.Python中的继承与多继承详解
    【从零学习python 】47. 面向对象编程中的继承概念及基本使用
    【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
    【从零学习python 】45.Python中的类方法和静态方法
    【从零学习python 】44.面向对象编程中的私有属性和方法
    【从零学习python 】43. Python面向对象编程中的实例属性和类属性
    【从零学习python 】42.Python中的内置属性和方法
    【从零学习python 】41.python魔法方法(二)
    【从零学习python 】40.python魔法方法(一)
    【从零学习python 】39.面向对象基本语法及应用示例
    【从零学习python 】38.Python包的使用及导入方式
    【从零学习python 】37.Python自定义模块的使用和注意事项
    【从零学习python 】36.Python中使用pip进行第三方包管理的方法与技巧
    【从零学习python 】35. Python常见系统模块及其用法
    【从零学习python 】34.Python模块的导入和使用方法详解
    【从零学习python 】33.装饰器的作用(二)
    【从零学习python 】32.装饰器的作用(一)
    【从零学习python 】31.深入理解Python中的高阶函数和闭包
    【从零学习python 】30.深入理解递归函数和匿名函数
    【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法
    【从零学习python 】28. Python中的局部变量和全局变量
    【从零学习python 】27. Python 函数的使用及嵌套调用
    【从零学习python 】25.函数:提高代码编写效率的利器
    【从零学习python 】24. Python中的字符串操作与遍历方法
    【从零学习python 】23. Python中集合(set)的使用方法和常见操作
    【从零学习python 】22. Python中的字典的增删改查及字典的变量
    【从零学习python 】21.Python中的元组与字典
    【从零学习python 】20. Python列表操作技巧及实例
    【从零学习python 】19. 循环遍历列表和列表嵌套的应用
    【从零学习python 】18. Python列表的基本操作详解(一)
    【从零学习python 】17. Python字符串的format方法(二)
    【从零学习python 】16. Python字符串的format方法(一)
    【从零学习python 】15.深入了解字符串及字符集编码
    【从零学习python 】14.Python字符串常见操作(二)
    【从零学习python 】13.Python字符串常见操作(一)
    【从零学习python 】12.Python字符串操作与应用
    【从零学习python 】11.Python循环语句和控制流程
    【从零学习python 】10.Python条件语句和if嵌套详解
    【从零学习python 】09.Python 中的条件判断语句
    【从零学习python 】08.Python了解位运算符, 运算符优先级
    【从零学习python 】07.Python运算符详解:赋值、比较和逻辑运算符
    【从零学习python 】06. Python中运用算数运算符进行计算和字符串拼接
    【从零学习python 】05. Python中的输出和输入
    【从零学习python 】04. Python编程基础:变量、数据类型与标识符
    【从零学习python 】03. Python交互式编程及注释详解
    【从零学习python 】02. 开发工具介绍
    【从零学习python 】01. 安装配置python

  • 相关阅读:
    [附源码]计算机毕业设计万佳商城管理系统Springboot程序
    3、Tomcat类加载机制
    C#:实现迪杰斯特拉算法​(附完整源码)
    与MQTT的初定情缘
    深入Java了解面向对象编程(OOP)
    输出与输出
    算法入门(三):异或位运算的知识和拓展
    Java中的异常和错误
    翻译: Transformer一种用于语言理解的新型神经网络架构 Google AI
    swiperJS滑动时监听事件
  • 原文地址:https://blog.csdn.net/qq_33681891/article/details/132661958
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号