关于shell:awk 的学习(一) 写在前面的东西

正所谓,知己知彼百战不殆,想要拿下awk,必需了解它的前世今生;

一、它可以做什么

    1、 awk 是一种编程语言, 可以用作linux或者Unix的bash脚本中;也可以单独放在一个文件中,通过awk命令解释器运行;

          【这里只关注awk用作bash脚本中】

    2、awk 主要功能是,基于指定的规则,对文本或者数据做浏览和提取操作;  其处理原则为:逐行扫描文件,从第一行到最后一行,寻找匹配指定规则的内容。   【awk命令的主要功能是对文本做提取操作,所以,bash脚本编写中,awk经常与其它指令联合是使用:通过awk提取指定行,然后对该行做你所需要的操作。

二、它怎么使用呢 

   1、语法结构

      awk    选项   '命令部分'    文件名

   【基本的awk 指令语法构成就是如上所示,也有一些更高阶的操作,这个后续再学习】

 2、一些基本概念 【写在前面的东西】

    1)分隔符和域   

        分隔符,就是语法结构中的『选项』部分,  awk指令中,通过 -F   来定义字段的分隔符; awk指令默认的分隔符为空格,如果要处理的文件时以空格分割,则无需指定选项 -F ;  如果是通过除空格之外的其它字符分割,则必需指定-F ;

        域: 定义了分隔符,则比如会有文本被分割成一段一段的, 这里统称为域; 域的标记符为:$1,  $2,  $3 ...  $n  ;  其中,$0 表示所有的域;

      一个栗子:【遗留一个问题, 如果实现tab键分割,后续学习后,再补充

定义文件【文件包含多列,列之间通过逗号分割】:
vim 1
序号,姓名,年龄,职业$
1,张三,19,学生$
2,李四,25,程序员$
3,王五,40,教师$


awk -F ,  '{print $0}'  1

输出结果为:
序号,姓名,年龄,职业
1,张三,19,学生
2,李四,25,程序员
3,王五,40,教师

#解析:  -F  定义分隔符为逗号; 如果是以其它字符分割,则直接更换即可;
        $0  定义域,这里输出全部域;  【可以通过域标识符,更换输出的域, 比如$1, 则只输出第一列】 
        1   为我定义的文件名字;

     2)模式和动作

     他们说,awk语句,是由『模式』和『动作』两部分组成的;那么什么是模式,什么是动作呢?

     动作:就是,定义对数据的具体操作;【也就是一些列的操作指令】;

     模式:则定义了『动作』被触发的条件; 

               【可以是条件语句、正则匹配、复合语句等】;

               【当然了,这并非必需的,若没有定义模式,则动作将保持时刻被触发的状态】

               【模式以关键词BEGIN和END来标识, 其中BEGIN 定义在 动作之前执行;  END定义的内容则在动作之后执行】

        一个栗子:

还是文件: 1;

执行如下指令:
$ awk -F , 'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}'  1 


输出结果为:
---start print the file---
姓名
张三
李四
王五
---the end---



#解析:  
1、-F: 定义分隔符,不做解释;
2、'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}'   为模式定义和动作定义;  单引号不能省略;
  1)其中  BEGIN {print "---start print the file---"}   定义动作开始前执行的操作; 
  2){print $2}  为动作定义;
  3) END {print "---the end---"}'  定义动作结束后执行的操作;
  4)每一个操作,需要{};
  

          

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章