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 日常工作用法总结