shell 命令awk的用法

四、awk

    4.1前言

       awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。

数据可以来自标准输入、一个或多个文件,或其它命令的输出。

它支持用户自定义函数和动态正则表达式等先进功能,

       awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。

如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),

    4.2语法

       awk [options] ‘commands’ filenames

       options: -F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)

       command(时空):BEGIN{}发生在行处理前;

                     {}行处理时,读一次执行一次

                     END{}行处理后

    4.3内部变量

       FS:输入字段分隔符awk -F: '{print $1, $3}' /etc/passwd | head -1

       OFS:输出字段分隔符awk -F: 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd | head -1

       RS:输入记录(行)分隔符,默认换行符awk 'BEGIN{RS="   "}{print $0}' a.txt

       ORS:输出记录(行)分隔符,默认换行符

       FNR:多文件独立编号

       NR:多文件汇总编号awk -F: '{print NR, $0}' /etc/centos-release /etc/hosts

       NF:字段总数awk -F: '{print NF, $0}'  /etc/passwd

    4.4格式化输出

       print函数:

       awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd | head -1

       printf函数:

       语法:%s 字符类型

              %d 数值类型

              %f 浮点型,可以定义保留

              占15字符

              - 表示左对齐,默认是右对齐

              printf默认不会在行尾自动换行,加\n

              , 逗号,输出字段分隔符

       示例:

       [root@localhost ~]# awk -F: '{printf "%-10s %-10s %-15s\n", $1,$2,$3}' /etc/passwd | head

   4.5模式(正则表达)和动作

        概念:

       任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。

模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。

       字符串比较:

       # awk    '/^root/'     /etc/passwd

       # awk '$0 ~ /^root/' /etc/passwd

       # awk '$0!~/^root/' /etc/passwd

       # awk -F: '$1 ~ /^root/' /etc/passwd

       数值比较:

       多条件:

    4.6awk脚本编程

       变量:

       自定义内部变量:-v

           awk -v user=root -F: '$1 == user' /etc/passwd

           -v定义变量

       外部变量”’”

       条件&判断:

       循环:

       数组:

    数组遍历:

    案例:

    1. 统计/etc/passwd中各种类型shell的数量

    awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }' /etc/passwd

    2. 统计Apache/Nginx日志中的访问前十 <统计日志>

    cat  access_log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值