awk [options] 'condition{cmd};condition{cmd}' file
(分号不必须)
awk 接受标准输入、管道、文件,逐行处理文本。
options 一览
option | 功能 |
---|---|
-F | 指定分隔符,默认是tab或者空格; -F '\t\t' 指定为双tab |
-v | 设置变量,-v x=aa -v y=bb ;awk -v x='hhh' '{print x}' file 不需使用$x 取变量如果是x='hhh' ,需print "'$x'" ; |
特殊常量一览(诸如FS此类常量,取值不需 $
)
常量 | 含义 |
---|---|
FS | field slash 字段分隔符,默认是空格 |
OFS | field slash 输出结果的字段分隔符,默认是空格 |
RS | row slash 行分隔符,默认是换行符 |
ORS | row slash 输出结果的行分隔符,默认是换行符 |
NF | number of field 当前行中字段数 |
NR | number of row 当前行号,和sed一样,从1开始 |
FNR | 当前输入文档的当前行号,多个文档时有用 |
FILENAME | 当前输入文档的名称 |
$0 | 当前行全部内容 |
$n | 当前行中第n个字段 |
awk比较符
比较符号 | 功能 |
---|---|
/aaa/ | 全行数据正则匹配 |
!/aaa/ | 全行数据正则匹配后取反 |
~/aaa/ | 对特定数据正则匹配 |
!~/aaa/ | 对特定数据正则匹配后取反 |
||、&& 、!=、 >、 <、 >=、<= | 常规的含义 |
BEGIN & END
begin 是在读取所有行之前执行一次,end是在读完所有行后执行一次;
所有, 一般用BEGIN{cmd;cmd;...}
来初始化 END{cmd;cmd;..}
来汇总。
内置函数
函数声明 | 功能 |
---|---|
getline; | 读取下一行,执行后不影响其他命令执行,$0 NF等都置换为下一行的 |
next; | 跳转下一行,与getline不同的是,会从头开始执行awk命令 |
sin(x) | 求x的余弦值 |
cos(x) | 求x的正弦值 |
tolower(str) | 转换为小写字母 |
toupper(str) | 转换为大写字母 |
split(str,arr[,sepr]) | 将str根据sepr分割,存入到数组arr中,seperator默认是空格 |
gsub(regx,str[,t]) | 将t中所有正则regx能匹配到的用str替换,t不写默认是$0 |
sub(regx,str[,t]) | 将t中第一个正则regx能匹配到的用str替换,t不写默认是$0 |
substr(str,start,step) | 截取字符串,从start起的step个字符 |
match(str,regx) | 返回正则表达式在字符中的位置 |
index(str1,str2) | 返回str2在str1中的位置 |
length(str) | 返回str长度 |
rand() | 返回一个0到1之间的随机数 |
srand(x) | 设置随机种子 |
systemtime() | 返回时间戳 |
system("cmd")
在awk中使用shell命令
实用命令
awk -v FS=":" '{print $1}' test.txt
重新定义字段分隔符为:
awk -v FS="[:,-,]" '{print $1}' test.txt
重新定义字段分隔符为:
和-
awk -v OFS=". " '{print NR,$0}' file
输出结果标上行号
awk '/hello/{print $0}' file
基础正则,匹配到行中包含hello的打印,{print $0}
可省略
fsh all fwyymis ssh "cat /home/homework/log/zhibo-sql/zhibo_sql.log.slow.20201027*" | awk -F '[\]\[\?]' -v OFS=';' '{if(match($0,/URI/)==0){next}else{print $2,$7,$9,$(NF-1)}}' > slow.log.20201027
awk '{printf("%6.2f %s\n",\$2*\$3,$0)}' xxx.data | sort
按照第2列和第3列的乘积 排序输出
cat access.log.2019070517 | grep /assistantdesk/desk/student/performance | cut -d " " -f 4 | sort | uniq -c | sort -r |head -10
统计日志中第四个参数(例如ip)出现次数最多的前10名
head -1 access.log.2019070517 | awk -F ' ' '{for(i=1;i<=NF;i++){print $i}}' | cat -n
一条日志 行转列 并加行号
网友评论