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{}
仅在文件处理完毕之后执行一次
# 打印多个字段时使用逗号分割,默认输出分隔符为空格
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()
执行系统命令