date: 2020-09-20title: awk详解 #标题
tags: awk #标签
categories: linux大杂烩 # 分类

这么久以来,貌似从不敢说完全掌握了awk这个工具,又没什么耐心去好好研究此工具,对于awk的使用,一直停留在简单的列过滤,可好好想想,作为shell脚本的三剑客之一的一个工具,还是耐着性子好好整理一下其语法吧。

awk常用内置变量

变量名 描述
FILENAME 当前输入文档的名字
FNR 当前输入文档的当前行号,尤其当有多个输入文档时有用
NR 输入数据流的当前行号
$0 当前行的所有内容
$n… n大于0,表示当前行的第n个字段的内容
NF 当前行的字段(列)的个数
FS 字段分隔符,通常使用-F选项代替
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认为换行符\n
RS 输入记录分隔符,默认为换行符\n

NR

  1. # 输出行号
  2. $ free | awk '{print NR}'

NF

  1. # 输出每行的总列数
  2. $ free | awk '{print NF}'
  3. # 输出每行的倒数第二列
  4. $ free | awk '{print $(NF-1)}'
  5. # 输出每行的倒数第三列
  6. $ free | awk '{print $(NF-2)}'

$0

  1. # 打印每行的所有列
  2. $ free | awk '{print}'
  3. # 亦可以使用如下指令
  4. $ free | awk '{print $0}'

FS

  1. # 以冒号、逗号或横线进行分隔,然后输出第二列
  2. $ awk -F[:,-] '{print $2}' test.txt
  3. # 注: 在[ ] 的集合中的横线,放在中间就表示范围区间,比如[a-z]
  4. # 所以当我们需要普通字符-时,就需要将其放在开头或末尾,如[-abc]或[abc-]

RS

  1. # 匹配逗号,一个逗号为一行。而不是默认的换行符就是一行
  2. $ awk -v RS="," '{print}' test.txt

OFS

  1. # 输出内容时,每一列都以“-”号分隔(默认为空格)
  2. $ awk -F: -v OFS="-" '{print $2,$1,$2}' test.txt

自定义变量

  1. # 定义x变量并输出x变量值及文件中第一列的值。
  2. $ awk -v x="zhangsan" '{print x,$1}' test.txt
  3. # 定义多个变量
  4. $ awk -v x="zhangsan" -v y=11 '{print y,x,$1}' test.txt
  5. # 输出时,打印行号(默认初始值为0,所以自定义初始值为1)
  6. $ awk -v y=1 '{print y++ ": " $1}' test.txt
  7. 1: biscuit:crisp:ckicken
  8. 2: salt-jam::iol,sugar
  9. 3: banana:lemon,pear--apple:grape

调用系统变量
  1. # 通过 -v 调用
  2. $ x='hello'
  3. $ awk -v y=$x '{print y}' test.txt
  4. # 通过组合多个引号调用
  5. $ x='hello'
  6. $ awk '{print "'$x'"}' test.txt

print

  1. $ awk -F: -v i=1 '{print "第" i "行第1列为: " $1,"\t第" i "行第2列为: " $2 i++}' test.txt
  2. 1行第1列为: biscuit 1行第2列为: crisp1
  3. 2行第1列为: salt-jam 2行第2列为: 2
  4. 3行第1列为: banana 3行第2列为: lemon,pear--apple3

awk实现数学运算

  1. # 基础运算:
  2. $ echo '10 3' | awk '{print $1/$2}'
  3. 3.33333
  4. $ echo '10 3' | awk '{print $1 * $2}'
  5. 30
  6. # 变量
  7. $ a=10
  8. $ b=3
  9. $ echo | awk "{print $a/$b}" # 注意此处必须是双引号
  10. 3.33333
  11. # 指定小数位数:
  12. $ echo $a $b | awk '{printf "%.2f\n", $1/$2}' # 保留两位小数
  13. 3.33