陈某某的网络日志

活到老学到老,学习无止境

0%

gawk学习笔记

0.简介

awk是三个主要作者的姓的首字母缩写:Drs. A. Aho、P. Weinberger 和 B. Kernighan。awk是命令行工具,更是一种解释性语言,awk的代码不需要进行编译,运行时将代码脚本传递给awk解释器。awk语言使用类似 C 语言的语法,包括控制语句和字符串函数,如 printf 和 sprintf,基本上是相同的。gawk 是 GNU Project 的 awk开源的实现版本。

1.基本概念

  • 记录(Record):
    记录分隔符 分隔,记录分隔符RS 默认为换行符,所以默认一条记录就是一行。整个记录用$0表示
  • 字段(Field)
    将每个记录进一步分解为称作_字段_ 的单独的块。默认的字段分隔符FS 是任意数量的空白字符,包括制表符和空格字符。字段可以用$1,$2…表示
  • 语法规则
    /pattern/{action} 实际上是 $0 ~/pattern/{action}的简写,只有前半部分的判断pattern的结果为真时,action才会执行. ~是关系操作符,表示匹配。!~为不匹配。
  • BEGIN 和 END 模式
    AWK 包含两种特殊的模式:BEGINEND
    BEGIN 模式指定了在处理任何记录之前需要执行的操作:
    BEGIN{action}
    END 模式指定在处理了所有记录之后需要执行的操作:
    END{action}

2.工作原理

第一步,执行BEGIN{action}
第二步,从文件或stdin读取一行,执行/pattern/{action} 。重复执行这步直到最后一行。
第三步,执行END{action}

3.如何执行

  • 1.命令行直接运行:gawk -opt '/pattern/{action}' file 适合较短的awk程序
  • 2.先编写gawk代码,保存到文件,如test.awk,再在命令行执行:
    gawk -f test.awk file1,file2
  • 3.把gawk命令 gawk '/pattern/{action}' 写进脚本文件 run.awk
    再给该文件加执行权限:chmod +x run.awk
    最后直接运行脚本文件:./run.awk file

4.常用语句,内建变量,内建函数

  • action中常用语句
语句 描述
exit 停止程序的执行,并且退出。
next 停止处理当前记录,并且前进到下一条记录。
nextfile 停止处理当前文件,并且前进到下一个文件。
print 打印使用引号括起来的文本、记录、字段和变量。(默认打印出当前整行记录。)
printf 打印格式化文本,类似于它的 C 语言对等成分,但必须指定结尾的换行。
  • 常用的gawk内建变量
变量 描述
NF 每个记录的字段个数。
NR 当前的记录个数。 读入多个文件时,NR会一直累计。
FNR 每读到一个新的文件,FNR从0开始累计。
FS 字段分隔符。
RS 记录分隔符。
OFS 输出字段分隔符。
ORS 输出记录分隔符。
FILENAME 所读取的输入文件的名称。
IGNORECASE 当 IGNORECASE 设置为非空值,GAWK 将忽略模式匹配中的大小写。
  • 常用内建函数
    gawk内建函数包括算术函数和字符串函数,还有一些IO函数.
    length(s) 返回字符串长度,无参数返回$0长度
    split(string,array,[sep]) 分割字符串到数组中,返回元素的个数,未指定sep,使用FS
    sub(regex,s,t) 在字符串t中,用s替换regex的首次匹配,成功返回1,否则返回0
    match(s,regex) 如果regex在s中出现,则返回出现的起始位置,没有出现返回0。并会设置RSTART RLENGTH的值。
    system(command) 执行系统命令

5.实例

  • 只输出第10行 gawk 'NR==10{print $0}' file
  • 统计词频 gawk '{for(i=1;i<=NF;i++){count[$i]++;}} END {for(i in count){print i,count[i]}}' file
  • 计算行数 gawk 'END{print NR}' file
  • 打印匹配正则表达式的行 (模拟grep) gawk '/regex/ file'

6.参考资料