awk 101

变量 意义 默认值
ARGC 命令行参数的个数 -
ARGV 命令行参数数组 -
FILENAME 当前输入文件名 -
FNR 当前输入文件的记录个数 -
FS 控制着输入行的字段分割符 “ “
NF 当前记录的字段个数 -
NR 到目前为止读的记录数量 -
OFMT 数值的输出格式 “%.6g”
OFS 输出字段分割符 “ “
ORS 输出的记录的分割符 “\n”
RLENGTH 被函数 match 匹配的字符串的长度 -
RS 控制着输入行的记录分割符 “\n”
RSTART 被函数 match 匹配的字符串的开始
SUBSEP 下标分割符 “\034”
$0 当前行
$1 .. $n 列号
  • awk在读取输入之前先执行BEGIN关联的语句,反之处理完所有输入的记录之后执行END关联的语句。

  • 可以使用八进制替代单引号或双引号。

  • 在awk运行规则中,patternaction可以省略其一,但不能同时省略。如果pattern省略则在输入的每一行上执行action;如果action省略则默认的action是打印行。多个rule可以使用;隔开。

  • @load关键字可以用于加载awk外部扩展(系统库文件),这样就可以链接已编译的代码,或者执行awk不支持的功能。

  • 记录分割符用于将多个记录分开,默认的记录分隔符是换行符。若要指定新的记录分隔符可以给内建变量
    RS赋值,或通过参数-F指定。

1
2
3
4
5
6
7
awk 'length($0) > 80' data # 打印长度大于80的行
awk '{ if (length($0) > max) max = length($0) } END { print max }' data # 打印最长行的长度
awk 'NR % 2 == 0' data # 打印偶数行
ls -l | awk '$6 == "Nov" { sum += $5 } END { print sum }'
awk '$1 ~ /J/' inventory-shipped # 正则匹配
awk '$1 !~ /J/' inventory-shipped # 正则不匹配
awk ’/li/ { print $0 }’ mail-list # 打印包含li的行,/*/ 中间部分为正则表达式,$0 代表行