文本分析工具awk

简介

awk是一个强大的文本分析工具,它认为文本都是结构化的,它将每一个输入行定义为一个记录, 每行中的每个字符串定义为一个域(),域和域之间用分隔符分隔。
功能:流程控制,数学运算,进程控制,内置的变量和函数,循环和判断。

工作原理

awk采用“行工作模式”,将文件一行行的读入,并进行拆分处理。

  • 读入一行(一条记录),将其存入内置变量$0中
  • 使用段分隔符分隔这条记录(分隔符由内置变量FS指定,默认采用空格" "分隔),把分隔后的段顺序存入内置变量$(1-100)
  • 输出每个段的时候也可以通过内置变量OFS指定分隔符,默认也是空格
  • 循环,读入下一行

常用内置变量

  • 关于记录
    $0 当前记录(作为单个变量)
    NR 已经读出的记录数,即当前行号,Number of Row
    RS 输入记录的分隔符,默认为换行符
    ORS 输出记录的分隔符,默认也是换行符
    FNR 当前记录数

  • 关于段
    $1-$n 当前记录的第n个字段,字段间由FS分隔
    NF 当前记录中域(字段)的个数,就是列号。Number of field
    FS 输入字段分隔符,默认空格
    OFS 输出字段分隔符,默认空格

  • 环境变量等
    ARGC 命令行参数个数
    ARGV 命令行参数数组
    ARGIND 当前被处理文件的ARGV的标志符
    FILENAME 当前输入文件名
    CONVFMT 数字转换格式%.6g
    IGNORECASE 若值为真,则进行忽略大小写的匹配
    ENVIRON Unix环境变量
    ERRNO Unix错误信息
    FIELDWIDTHS 输入字段宽度的空白分隔字符串
    RESTART 被匹配字符串的字符串首
    RLENGTH 被匹配字符串的字符串长度

awk的使用(大部分与C语法一致)

正则表达式

.*^$?+[]<>()
不支持() {}

关系运算符

<>

!=

=
<=
~匹配
!~不匹配
大部分与C语言一致

逻辑运算符

&& || !(与 或 非),这里与C语言语法一致

算术运算符

      • / % ^(加 减 乘 除 取模 幂运算),这里与C语言语法一致

BEGIN END

BEGIN{动作1;动作2;...} 在处理文件之前,要执行的动作;只执行一次。
用于给文件添加标题,定义变量,定义文件的分隔符等

END{动作1;动作2;...} 在处理完文件之后,要执行的动作;只执行一次。
汇总的操作

流程控制

表达式语句:(表达式?值1:值2),if判断,if-else, for,while等语法与C语言几乎一致,在此不过多叙述了。
next表示处理输入行的下一行
exit退出

一个awk中数组使用的例子
文本文件array1内容如下:

BEGIN{
        a[1]="a1";
        a[2]="a2";
        a[3]="a3";
for ( i = 1; i <= 3; i++)
        print "数组a["i"]的值是"a[i]
}

终端输入命令:$ awk -f array1,输出如下

数组a[1]的值是a1
数组a[2]的值是a2
数组a[3]的值是a3

一些内置函数

split切割字符串

split("待切割字符串",数组名,"切割用的分隔符")

toupper 与 tolower

大小写转换

sub与gsub

局部替换与全局替换
sub(/要替换的内容/,"替换成什么内容")
gsub(/要替换的内容/,"替换成什么内容")
gsub(/要替换的内容/,"替换成什么内容",指定字段)

length

计算字符串长度

数学函数:sin,cos,int,sqrt等

print打印到终端

eg:打印当前系统变量的某个特定值
$ awk 'BEGIN{print ENVIRON["PATH"];}'

printf 格式输出

格式控制符与C语言基于一致,%o以无符号八进制表示的整数,%g以科学计数法或浮点数的格式显示数值,%%显示其自身。
修饰符:
-:左对齐
+:显示数值符号
N:显示
-F 指定段的分隔符
说明:
对于小数取保留位的时候,最低位进行四舍五入,而取整的时候,直接舍去小数部分。

总结

  1. 需要记住一些内置变量,如NR表示行号(记录),NF表示列号(域)
  2. 其实看完这些,还是并没有会用吧,哈哈,还是得多实践吧!

参考文献

Shell脚本之awk详解

你可能感兴趣的:(文本分析工具awk)