awk
作用
处理文本文件,文本分析
按行筛选,输出指定列
更适合格式化文本,对文本进行较复杂格式处理
官方文档:http://www.gnu.org/software/gawk/manual/gawk.html
语法
命令行
awk [选项参数][--help][--version] 'script' var=value file(s)
--help:查看帮助
--version:版本说明
参数
-
-F fs or --field-separator fs
指定字符串或正则分割# 先用空格分割,再用,分割,按分割后分组取出第一二列 awk -F '[ ,]' 'printf $1,$2' filename
-
-v vkey=value
赋值一个用户定义变量# 输出第一列,和第一列加1,如果为数字,增加1,如果为字符串替换成1 awk -va=1 '{print $1,$1+a}' log.txt
-
-f scripfile
从脚本文件中读取awk命令awk -f test.awk filename
-
-W re-interval
允许间隔正则表达式的使用
POSIX 选项: GNU 长选项:(标准)
-f 脚本文件 --file=脚本文件
-F fs --field-separator=fs
-v var=val --assign=var=val
短选项: GNU 长选项:(扩展)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[文件] --dump-variables[=文件]
-D[文件] --debug[=文件]
-e '程序文本' --source='程序文本'
-E 文件 --exec=文件
-g --gen-pot
-h --help
-i 包含文件 --include=包含文件
-l 库 --load=库
-L[fatal|invalid] --lint[=fatal|invalid]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[文件] --pretty-print[=文件]
-O --optimize
-p[文件] --profile[=文件]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
Tips
-
行匹配语句 awk只能用单引号
-
输出指定列
# 格式化输出1、4列 awk '{printf "%-8s%-10s\n" $1,$4}' filename # 输出第1列大于2的行 awk '$1>2' log.txt
-
正则匹配
# 输出包含xx的行 awk '/xx/' filename # 输出不包含xx的行 awk '!/xx/' filename
-
忽略大小写
awk 'BEGIN{IGNORECASE=1} /xx/' filename
-
AWK的hello world程序为:
BEGIN { print "Hello, world!" }
-
计算文件大小
$ ls -l *.txt | awk '{sum+=$6} END {print sum}' -------------------------------------------------- 666581
-
从文件中找出长度大于80的行
awk 'length>80' log.txt
-
运算符
运算符 描述 = += -= *= /= %= ^= **= 赋值 ?: C条件表达式 || 逻辑或 && 逻辑与 ~ 和 !~ 匹配正则表达式和不匹配正则表达式 < <= > >= != == 关系运算符 空格 连接 + - 加,减 * / % 乘,除与求余 + - ! 一元加,减和逻辑非 ^ *** 求幂 ++ -- 增加或减少,作为前缀或后缀 $ 字段引用 in 数组成员 -
内建变量(可以直接printf)
变量 描述 $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) -
内置函数
脚本
规则
- BEGIN{ 执行前的语句 }
- {处理每一行时要执行的语句}
- END {处理完所有的行后要执行的语句 }
数组
array_name['indexstr']=value
- 可以通过key有规律的定义模拟二维数组
- 使用 asort 完成数组元素的排序
- 使用 asorti 实现数组索引的排序
判断语句
if (condition)
{action-1};
else if (condition)
{action-2};
else
{action-3};
循环语句
for (initialisation; condition; increment/decrement)
{action} break/continue
while (condition)
{action}
函数
function function_name(argument1, argument2, ...)
{
function body
}