Linux三剑客之awk命令

一、awk简介

awk是linux中强大的文本数据处理工具,可以读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等功能;

awk 是『以“行”为一次处理的单位』,『以字段为最小的处理单位』,小说相关网页是主要针对文本的显示和处理,awk是很常用的一个工具。

二、awk的运作模式

    1、awk的语法:

[root@jing ~]# awk '条件类型1 {动作1} 条件类型2 {动作2}...' filename

    * awk后面的所有条件类型和动作都在单引号内,由于单引号不双引号都必须是成对的,单引号中使用非变量时,需要使用双引号括起来;

    * 条件类型【实例三】和动作是一组操作,当满足条件类型时,方执行后面紧跟的动作操作;

    * 条件类型即需要满足的条件,可以是表达式,也可以是正则;动作即对满足条件类型的数据所做的具体操作。

    * awk的条件类型的位置:

         根据语法表达式:条件类型1 {动作1},条件类型的位置在花括号外面,如 NR==1 {print $0} 代表 当当前处理行为第一行时,则输出当前行;

         条件类型的位置也可以在花括号内部,在花括号内部时,可使用if等条件语句,如 {if(NR==1) print $0}。

  2、行、字段【实例一】

        awk 是『以“行”为一次处理的单位』,『以字段为最小的处理单位』

       * awk 是『以“行”为一次处理的单位』:文件由若干行组成,文件中的每一行都会执行命令行中awk的命令

       * awk是『以字段为最小的处理单位』:行被分隔符分隔为若干个字段,$0代表当前行的所有数据,$1代表当前行的第一个字段,awk命令中可通过$0 $1 $2等来显示其对应的内容;

         如下为user.txt中的内容,第一行为例,$0代表 name mobile email整行的数据,$1=name,$2=mobile,$3=email

          name  mobile  email 

          jing    111111  2222@qq.com

  3、awk的内置变量【实例二】

变量名称说明
NF每一行 ($0) 拥有的字段总数
NR

当前 awk命令 所处理的是『第几行』数据

FS

分隔符,默认分隔符为空格;

FILENAME当前处理的档案名称
$0

当前行的数据

$1~$n当前行的第n个字段
OFS设置输出字段的分隔符,默认为空格
ORS设置输出行的分隔符,默认为换行符

 

   * 默认分隔符FS为空格时,$1 $2为空格分隔的字段;当分隔符为非空格时,则需要使用FS设定分隔符后方可取到$1 $2的值

4、awk的逻辑运算符【实例二】

     条件类型中可能需要使用到逻辑运算符,awk的逻辑运算符如下:

运算符代表意思
>大于
<

小于

>=大于或等于
<=小于或等于
==等于
!=不等于
~   匹配正则表达式
!~不匹配正则表达式,正则表达式即通用的正则语法

5、BEGIN和END模块【实例五】

     1)BEGIN和END模块简介

     在某些编程情况中,可能需要在 awk 开始处理文件中的文本之前执行初始化代码,和构造函数的初始化一样。对于这种情况, awk可以通过定义一个 BEGIN 块实现初始化代码;

     awk的BEGIN块是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置

     同理,awk 处理文件中的所有行之后,可能需要在最后做一些操作,对于这种情况,awk可以通过定义一个END块实现;通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。   

6、实例

      需要操作的文件awk_scores.txt的内容如下:

      

      

      1)实例一:行和字段

       *输出awk_scores.txt中的内容【行:$0代表当前行的数据】

       awk '{print $0}' awk-scores.txt

       

      *输出awk_scores.txt中每个人的姓名和03科目的分数【行的字段】

       awk '{print $1 "\t"  $4}' awk-scores.txt

       

      2)实例二:awk的内置变量

       *在awk_scores.txt的每一行输出当前操作行的行号

       awk '{print NR ":" $0}' awk-scores.txt

       

     3)实例三:awk的条件类型和逻辑运算符

       *输出awk_scores.txt的第二行,并在其行首输出当前行的行号【条件为逻辑运算符】

       awk 'NR==2 {print NR ":" $0}' awk-scores.txt【条件在花括号外】

       awk '{if(NR==2)print NR ":" $0}' awk-scores.txt【条件在花括号内】

       

       

       * 输出姓名为jing的所有行成绩【正则条件】

        awk '$1~/^jing$/ {print $0}' awk-scores.txt 

        awk '$1=="jing"{print $0}' awk-scores.txt 

        awk '{if($1=="jing")print $0}' awk-scores.txt 

        

 

       4)实例四:awk和其他命令组合使用

       *输出awk_scores.txt中前两行的内容

       awk '{print $0}' awk-score.txt | head -n 2

       

        *输出awk-scores.txt中最后两行的内容

        

      5)实例五:【BEGIN和END模块】

      需要操作的文件awk_scores.txt的内容如下:

      

      * 输出每个人的姓名和03科目的分数【BEGIN和END模块】

       方法一:命令行运行: awk '{FS="-"} {print $1 "\t"  $4}' awk-score.txt

       结果如图一,可以看到第一行并没有正确显示出来,因为我们读入第一行的时候, $1,$2... 的获取默认还是以空格键为分隔的,所以虽然我们定义了 FS="-" 了, 但是即仅能在第二行后才开始生效,这种情况就需要使用BEGIN块在awk处理文件中的文本之前,先把文件中的分隔符初始化为-,这样读入第一行的时候,便是分隔符为-的数据了。

      优化方法:awk 'BEGIN {FS="-"} {print $1 "\t"  $4}' awk-score.txt

       执行结果如图二,达到了想要的效果

       图一 

       

       图二

            

       6) 将awk的执行结果写入文件中

       

      7)实例七:OFS ORS

       *输出awk_scores.txt中所有的行,字段之间使用#分隔显示

        awk 'BEGIN{FS="-";OFS="#"}{print $1,$2,$3,$4}' awk-score.txt 

        通过BEGIN模块初始化分隔符,FS分隔符为-,得到$1~$n,OFS设置输出字段时,字段间的分隔符为#

        print字段时,字段之间使用逗号,OFS的输出分隔符方可生效。

       

        

       扩展资料

       https://coolshell.cn/articles/9070.html

       http://www.study-area.org/linux/system/linux_shell.htm

       https://jingyan.baidu.com/album/eae078277a52651fed548557.html?picindex=1

       https://www.cnblogs.com/ginvip/p/6352157.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值