Skip to content

Linux awk

harryfyodor edited this page Jul 21, 2017 · 2 revisions

本篇笔记记录了awk的简单使用方法。内容主要参考了《The AWK Programming Language》的第一章的内容。

1 总述

下面一个极为简单的例子可以展现awk程序的结构。

awk '$3 > 0 { print $1, $2 * $3 }' emp.data

AWK程序的结构 pattern { action }

运行AWK程序 awk 'program' input files

运行文件中的AWK程序awk -f progfile optional list of files

2 常用符号

  • $0 一整行
  • $1-$n 每一行的字段
  • NF 字段的数量
  • $NF 最后一个字段的值
  • NR 行号

3 格式化输出

{ printf("total pay for %-8s is $%.2f\n", $1, $2 * $3) }

%-8s表示左对齐8个空格,$%.2f表示两位结尾浮点数。类似C。

4 选择

选择是awk的重要功能,主要是通过通过pattern里面的逻辑来完成。

4.1 BEGIN & END

BEGIN一般用来打印标题。而END更多是为了通过对数据统计,计算得出最终的值。

BEGIN { print "BEGIN一般是用来放标题的。"; print "" } 
{ print } 
END { print "END里面常常放对前面数据进行统计和计算的函数。前面的函数就类似循环。" }

5 运行

5.1 字符串拼接

下面的程序把$1通过空格连接在了一起然后输出。

{ names = names $1 " " }
END { print names }

5.2 内建函数

  • length($0) 字符串有多长
  • gsub(Ere, Repl, [In]) Ere为正则,Repl替换值,[In]输入的字符串
  • substr(str, M, [N]) str是输入的字符串,M起点,第一个为1,N为字符串长度
  • split(str, A, [Ere]) str是输入的字符串,A分割的生成数组,Ere为分割符
  • match(str, Ere) str是输入的字符串,Ere为正则,作为匹配
  • tolower(str) 变为小写
  • toupper(str) 变为大写

6 流程控制语句(类C,不赘述)

7 数组

不需要声明,直接使用。下面是一个很简单的反序的例子。

{ line[NR] = $0 }
# remember each input line
END { i = NR
# print lines in reverse order
while (i > 0) {
  print line[i]
  i = i - 1
}

Clone this wiki locally