简介

awkLinux 最常用的字符串处理工具

awk 内置参数

  • NR – 行号
  • NF – 列总数
  • FILENAME – 当前文件名

实例

  • 打印 /etc/passwd 每行的行号,每行的字符总数以及第一行 (即每行的用户名)

    print 实现

    $ awk -F ':' '{print "Line:"NR,"Col:"NF,"User:"$1}' /etc/passwd
    

    printf 实现

    $ awk -F ':' '{printf "Line:%s,Col:%s,User:%s\n",NR,NF,$1}' /etc/passwd
    
  • 打印 /etc/passwdUID(即第三列) 大于 100 的行的行号,字符总数以及第一列 (即每行的用户名)

    print 实现

    $ awk -F ':' '{if ($3>100) print "Line:"NR,"Col:"NF,"User:",$1}' /etc/passwd
    

    printf 实现

    $ awk -F ':' '{if ($3>100) printf("Line:%s,Col:%s,User:%s\n",NR,NF,$1)}' /etc/passwd
    
  • 提取服务器日志 fresh.logERROR 行发生的时间

fresh.log 内容格式如下图

利用 sedawk

$ sed '/ERROR/p' fresh.log | awk '{print $1}'

只利用 awk

$ awk '/ERROR/{print $1}' fresh.log

START END

awk 提供了一个简单的方式在利用 awk 处理编程需求时的问题,例如制表时需在表前打印表头、表后打印表尾。

举一个案例,制表显示 /etc/passwd 的行号、列号和用户名

思路是首先在开头打印”Line Col User”,然后依次打印 /etc/passwd 每一行的行号、列号和用户名,最后另起一行打印 -------- 并在中间加入 awk 操作的文件名以结束制表

$ awk -F ':' 'BEGIN{print "Line    Col    User"}{print NR,NF,$1}END{print "------",FILENAME,"------"}' /etc/passwd | grep -v "#"

其中的 grep -v "#" 用以过滤掉 /etc/passwd 中开头的无用说明信息

运行结果

为截图方便这里只截了前面的一些行和最后的一些行