awk 日常工作用法总结

Shell 2133℃

AWK 是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。AWK 名称得自于它的创始人,分别是 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。

语法格式

awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)

常用选项参数:

  • -F fs 或 –field-separator fs 指定文件折分符,默认是空格。fs是一个字符串或者是一个正则表达式,如-F:
  • -v var=value 或 –asign var=value 赋值一个用户定义变量
  • -f scripfile 或 –file scriptfile 从脚本文件中读取awk命令

使用默认分隔符,输出1、4列

awk '{print $1,$4}' log.txt
#不指定分隔符-F,默认是空格分割列
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
#上面是格式化输出

指定分隔符,输出1、2列

awk -F, '{print $1,$2}'   log.txt
# 使用内建变量
awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
# 使用多个分隔符:先使用空格分割,然后对分割结果再使用","分割
awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt

设置变量

awk -v a=1 '{print $1,$1+a}' log.txt
awk -v a=1 -vb=s '{print $1,$1+a,$1b}' log.txt

从脚本文件中读取命令

 awk -f cal.awk log.txt

运算符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: 条件表达式
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除,求余
+ – ! 加,减,逻辑非
^ *** 求幂
++ – 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

根据列的值大小过滤

过滤第一列值大于2的行

awk '$1>2' log.txt

过滤第一列等于2的行

awk '$1==2 {print $1,$3}' log.txt

过滤第一列大于2并且第二列等于’Are’的行

awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt

内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)

输出顺序号NR, 匹配文本行号FNR

awk '{print NR,FNR,$1,$2,$3}' log.txt

指定输出分割符

awk '{print $1,$2,$5}' OFS=" $ "  log.txt

使用正则,字符串匹配

输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' log.txt
# ~ 表示模式开始。// 中是模式。
输出包含"re" 的行
awk '/re/ ' log.txt

忽略大小写

awk 'BEGIN{IGNORECASE=1} /this/' log.txt

模式取反

awk '$2 !~ /th/ {print $2,$4}' log.txt
awk '!/th/ {print $2,$4}' log.txt

awk脚本

关于awk脚本,我们需要注意两个关键词BEGIN和END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • {这里面放的是处理每一行时要执行的语句}
  • END {这里面放的是处理完所有的行后要执行的语句 }

awk脚本如下:

#!/bin/awk -f
#运行前
BEGIN {
    printf "begin\n"
}
#运行中
{
    printf "run\n"
}
#运行后
END {
    printf "end\n"
}

AWK输出hello world脚本

BEGIN { print "Hello, world!" }

计算文件大小脚本

ls -l *.txt | awk '{sum+=$6} END {print sum}'

找出长度大于80的行

awk 'length>80' log.txt

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

转载请注明:零五宝典 » awk 日常工作用法总结