简介

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中开头的无用说明信息

运行结果

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