awk用法笔记

awk

awk的基本用法

  • awk [ options ] program FILE ...
    • program : PATTERN{ACTION STATEMENTS}
    • ACTION STATEMENTS支持使用多条语句,语句间使用分号分隔
  • awk [ options ] -f program-file FILE ...

awk常用选项(options)

  • -F 指明输入数据时的字段分隔符
    • 多分隔符'%| '+[% ]+
  • -v VAR=VALUE 自定义变量

awk内建变量

awk内部引用变量无需使用$

  • FS(input field seperator) 输入时字段分隔符 默认为空白字符 可以使用-F指定分隔符
  • OFS(onput field seperator) 输出时字段分隔符 默认为空白字符
  • RS(input record seperator) 输入时换行分隔符 默认为换行符
  • ORS(onput record seperator) 输出时换行分隔符 默认为换行符
  • NF(number of field) 每一行的字段数量
    • $NF 最后一列字段
  • NR(number of record) 行的数量
  • FNR(file number of record) 各文件单独计数行号
  • FILENAME 当前文件名
  • ARGC 命令行参数的个数
  • ARGV 数组,保存命令行所给定的各参数

awk的操作符

  • + - * / ^ % 算术运算
  • > < == >= <= 比较运算
  • = += -= *= /= ++ -- 赋值运算
  • && || ! 逻辑运算
  • ~ !~ 模式匹配符 判断符号前的字符串是否匹配符号后的pattern

PATTERN

  • empty 空模式 匹配每一行
  • relational expression 关系表达式 一般为比较大小 返回bool型
  • /regular expression/ 正则表达式模式 仅处理被模式匹配的行
  • /pat1/,/pat2/ 行范围
  • BEGIN/END
    • BEGIN{} 仅在开始处理文件之前执行一次
    • END{} 仅在文件处理完毕之后执行一次

print

# 打印多个字段时使用逗号分割,默认输出分隔符为空格
awk '{ print item1, item2 … }' FILE
  • $0 打印整行字符 可省略
  • 逗号 逗号 输出分隔符为空格
  • 双引号 双引号 不解析变量 输出字符串本身
  • 空格 空格 输出字段没有分隔符

printf

# 格式化输出
awk '{ printf FORMAT, item1, item2 … }' FILE
格式符
  • %c 显示字符的ASCII码
  • %d %i 显示十进制证书
  • %e %E 科学计数法数值显示
  • %f 浮点数
  • %g %G 以科学计数法或浮点数形式显示数值
  • %s 字符串
  • %u 无符号证书
  • %% 百分号自身
修饰符
  • %[-][#[.#]]d
    • 第一个数字控制显示宽度
    • 第二个数字控制浮点精度
    • -# 表示左对齐 默认右对齐
    • +# 显示数值的符号

ACTION中的控制语句

  • if (condition){statments} else {statments} 多分支if语句
  • while (condition){statments} while循环
  • do {statments} while (condition) do while 循环
  • for (exp1;exp2;exp3){statments} for循环
  • selector?if-true:if-false 三元运算表达式
  • switch (expression){case VALUE stetement;case VALUE stetement ...} switch多分支语句
  • break``continue``exit 循环控制语句
  • delete array[index]``delete array 删除数组或数组元素
  • next 提前结束本行处理 进入下一行处理

awk数组

  • 如果数组元素事先不存在,在调用时会自动创建此元素,并将其初始化为空值
  • 在awk的数值运算中,任意字符串均被隐式转换为0
  • 判断数组中是否存在某元素使用index in array,返回bool值
# 统计当前各网络状态数量
[root@stardust ~]# netstat -a |awk '/^tcp/ {state[$NF]++} END { for (a in state) print a,state[a] }'

# 统计文件各单词的出现数量
[root@stardust ~]# awk '{for(i=1;i<=NF;i++){S[$i]++}} END{for(a in S)print a,S[a]}' FILE

awk常用内置函数

  • rand() 返回0-1间的随机浮点数
  • length() 获取字符串长度
  • sub() 字符串查找替换
  • gsub() 全局字符串查找替换
  • split() 字符串切割
  • system() 执行系统命令

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





posted @ 2017-11-29 01:47  Last_Stardust  阅读(199)  评论(0编辑  收藏  举报