awk

来自百合仙子's Wiki
跳转到导航 跳转到搜索

命令行选项

-f
指定脚本文件
-F
指定记录分隔符
-v
定义变量,后接 var=value 形式

语法

指令

nextfile
停止对当前文件的处理,读取下一文件。适用于 gawk[1]、mawk >= 20120627[2]、bwk

函数

标准内建函数

[3]

整数

int(x)
取整

字符串

length(str)
取字符串长度
printf(fmt, arg, ...)
格式化输出。结尾不自动添加换行符
sub(egexp, replacement [, target])
通过正则替换修改变量值。target默认为$0
substr(string, start [, length])
start(从 1 开始)处截取长度为 length(默认到末尾)的字符串

系统

system(cmd)
执行外部命令,如system("ls")

自定义函数

function ceiling(x) {
  return (x == int(x)) ? x : int(x)+1;
}

特殊的变量

RSORS是记录分隔符,可以是正则表达式RTRS所匹配的部分。当RS为空时,以一或多个空行作为分割符。

FSOFS是域分隔符。RS为空时,使用空串作为域分隔符(每个字符作为一个域)。

NR
当前记录序号
NF
当前记录的域数
FILENAME
文件名
FNR
当前文件内的记录序号

输入/输出

原地修改文件

这是一个 GNU 扩展,仅适用于 gawk

使用-i inplace载入相关脚本即可:[4]

gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

正则表达式

+, |
元字符
\t
Tab[5]grep 不支持)

示例

词频统计

BEGIN {
  FS="[^a-zA-Z]+"
}
{
  for (i=1; i<=NF; i++)
    words[tolower($i)]++
}

END {
  for (i in words)
    print i, words[i]
}

[6]

检查 shebang

awk 'FNR == 1 && /python -/ {print FILENAME;} FNR == 2 {nextfile;}' *(.R)

使用外部命令给 HTTP 日志添加地理位置信息

tip是获取 IP 地理位置信息的外部命令。

awk '{"tip "$1 | getline i; $1 = $1" ("i")"; print}' access.log > new_access.log

参见

外部链接

参考资料