shell编程之文本处理工具awk初探

 |   

AWK 是一个强大的文本分析工具,相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告时,显得尤为强大。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

简介

AWK 其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件为数据排序处理数据对输入执行计算以及生成报表,还有无数其他的功能。

使用方法

基本用法

1awk [-F FS] 'pattern{action}' filename

参数说明

  • pattern 表示 awk 在数据中查找的内容
  • action 在找到匹配内容时所执行的一系列命令
  • -F FS 指定域分割符为FS(一行代表一个记录,一个记录按 FS 分割成多个域)

核心 action

  • 内置变量
    • ARGC 命令行数量个数
    • ARGV 命令行变元数组
    • FILENAME 当前输入文件名
    • NR 当前文件中的记录号(行号)
    • FS 设置域分隔符,等价于 -F
    • RS 设置记录分隔符,默认是 ‘\n’
    • NF 浏览记录中域的个数
    • NR 已读的记录数
    • OFS 输出域分隔符
    • ORS 输出记录分隔符
    • $0 整条记录
    • $1/2 第 1/2 个域
  • 变量和赋值
    • 变量值可以是数字或字符串,关键是怎么用.
  • 条件语句和循环语句完全借鉴c语言
    • 内置函数
      • 数字 atan2/cos/exp/int/log/rand/sin/sqrt/srand
      • 字符串 index/length/match/toupper/tolower/substr/system/systime

样例演示

  • 统计 /etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容

    1awk -F ':' '{printf("filename:%11s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
    

    awk-var

  • 统计 /etc/passwd 中出现 oo 次数

    1awk -F ':' 'BEGIN{count=0;printf("login_name\tpasswd\n")} /oo/{printf("%-15s\t%s\n",$1,$2);count++} END{printf("count is %d\n",count)}' /etc/passwd
    

    awk-begend

    注意: BEGIN{} 表示在处理任意行之前进行的操作. END{} 表示在处理完所有行之后进行的操作.

  • 统计 /etc/passwd 中第 1 列以 s 开头的行

    1awk -F ':' '$1~/^s/{printf("%s\n",$1)}' /etc/passwd
    

    awk-s

  • 统计 /etc/passwd 中第 1 列为 sys 的行

    1awk -F ':' '$1=="sys"{printf("%s\n",$1)}' /etc/passwd
    

    awk==

    注意: ~和==都是匹配,不过~是不精确的比较,一般跟正则连用

参考文献

  1. 维基百科awk
  2. gawk官网
技术茶话会
< 前一篇 后一篇 >