awk的使用方法(二)

awk的工作方式是: 通过给定的参数,去逐行读取文本(或通过管道传递的内容),通过模式判断,再执行对应的动作
awk如何处理每一行的内容: awk每读一行,会将这一行的内容定义为$0, 再通过空格将这一行切割成多个字符串, 按顺序分别定义为$1 $2 $3 $4......以此类推

这一篇讲动作

动作,在awk中用{}包含,常见的动作包含:定义、计算、循环与判断、输出等

定义:
例1:         

#这个动作定义了一个变量a等于NR,这里的NR是一个awk的内置变量,用于记录第几行,每读一行文件,a就会更新,文件读完了之后输出a的结果,也就是文件的行数
awk '{a=NR}; END {print a}' /etc/passwd


例2:         

#这里定义了一个数组,索引是NR,内容是$0,最后输出其中一行
awk '{line[NR] = $0}; END {print line[12]}' /etc/passwd


例3: 

#FS是一个awk的内置变量,用于指定分隔符,默认是空格,这里将其改为冒号
awk 'BEGIN {FS=":"}; {print $4}' /etc/passwd
        

计算:
例1.行数

#自己定义一个变量num,没有初始化,默认为0,每读一行加一
awk '{num = num+1}; END {print num}' /etc/passwd
        


例2.加减

#使用变量相加,最后输出时减一
awk -F ":" '{sum=sum+$3}; END {print sum-1}' /etc/passwd


例3.乘除

#初始化为1,如果第三个字段不为0就相除,最后乘以2
#注意,awk可以不用定义变量即可使用,但是用做计算时该变量为0
awk -F ":" 'BEGIN {s=1}; $3 != 0 {s = s/$3}; END {print s*2}' /etc/passwd

循环:
例1.for

#这里结合上面的例子,在文件读完之后,加入一个for循环,将数组里面的内容逐行输出
awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{ 
        for (i in line){
            printf("%s\n", line[i])
        }
    };
' /etc/passwd
#上面的顺序是乱的,因为awk用的是关联数组,如果要按顺序输出,可以根据函数length取数组line的长度,再进行循环;
awk 'BEGIN {FS=":"}; {line[NR] = $0};        
    END{ 
        for (i=1;i<=length(line);i++)
            printf("%s\n", line[i])
    };
' /etc/passwd


例2.while

#和for循环基本没差别
awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{
        while (i<=NR-5){
            printf("%s\n", line[i])
            i++
        }
    };
' /etc/passwd


例3.if
 

awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{
        if (length(line)>30){
            printf("%s\n", "该文件的总行数大于30")
        }
        else{
            printf("%s\n", "该文件的总行数小于30")
        }
    };
' /etc/passwd


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值