目录
一、简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理。 awk是行处理器,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
二、主要参数
awk 参数 ' BEGIN{} // {action1;action2} END{} ' 文件名
-F 指定分隔符
-f 调用脚本
-v 定义变量
Begin{} 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令,多条命令用 ; 隔开
END{} 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
三、awk中字符的含义
-
$0 表示整个当前行 $1 每行第一个字段 NF 字段数量变量 NR 每行的记录号,多文件记录递增 FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始 \t 制表符 \n 换行符 FS BEGIN时定义分隔符 RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) ~ 包含 !~ 不包含 == 等于,必须全部相等,精确比较 != 不等于,精确比较 && 逻辑与 || 逻辑或 + 匹配时表示1个或1个以上 /[0-9][0-9]+/ 两个或两个以上数字 /[0-9][0-9]*/ 一个或一个以上数字 OFS 输出字段分隔符, 默认也是空格,可以改为其他的 ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 -F [:#/] 定义了三个分隔符
四、格式化输出
awk '{printf "%-5s %.2d",$1,$2}' test
printf 表示格式输出
%格式化输出分隔符
-5表示长度为5个字符
s表示字符串类型,d表示小数
分割连续多个空格符
`awk`默认会将连续的空格符视为一个分隔符,而不是多个分隔符。 可以尝试使用正则表达式作为分隔符,例如:
awk -F '[[:space:]]+' '{print $1}' file.txt
按制表符进行分割
awk -F'\t' '{print $1,$2,$3}' file.txt
如果某个列变量条件满足,输出整行数据
awk -F '\t' '{if($25 == 1) print}' prep_a_train_data.txt | less
提取每行日志的耗时时间,满足时间条件的,输出整行数据
#日志内容格式,例如:cost 2ms: com
cat log |awk '{sub(/ms:/,"",$2); if(int($2)>20)print}' | less
当数字大于1000时,会存在英文逗号的情况,需要进行删除,才能匹配判断
grep 'TIME COST STATISTICS' *.log | awk '{sub(/ms,/,"",$13);sub(/\[/,"", $13);sub(/,/,"",$13); if(int($13)>1000)print}' |grep 'uri' | less
变量匹配字符串前缀
cat *.log | awk '{if($12 ~ "^5") print}'
变量匹配 字符串中间内容
cat *.log | awk '{if($12 ~ /50/) print}'
匹配特定httpStatus(50前缀,可包含501,502,503,504,505等等),来输出nginx日志
awk -F '\t' '{if (match($11, /50/)) print}' 2024-06-23_https.test.com.log | less