转载:https://mp.weixin.qq.com/s/DG_SUz-AsjvdKOU6rwUnqA
awk的基本命令格式如下:
awk [-F分隔符] [-v 变量=值] 'BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }' file1 file2 ...
其中,-F用于指定字段分隔符,默认为空格或制表符;-v用于定义变量。
$0:整行数据$1~$n:按照分隔符分割后的字段NF:字段数量NR:已读取的行数FNR:当前文件的行数。BEGIN:在处理任何输入之前执行。END:在处理完所有输入后执行。在处理如access.log这样的日志文件时,awk能迅速提取和统计关键信息。例如,统计404错误的次数:
awk '{if ($9 == "404") count++} END {print "404 count:", count}' access.log
此脚本检查第九个字段(通常为HTTP状态码),若为404,则计数器count加一。
awk在数据统计方面同样表现出色。如计算一列数据的总和:
awk '{sum += $1} END {print "Total:", sum}' data.txt
这里,$1表示每行的第一个字段,sum变量用于累加这些值。
awk能够处理多字段,合并两个文件并匹配字段:
awk 'NR==FNR{a[$1]=$2; next} $1 in a {print $1, $2, a[$1]}' file1 file2
该脚本将file1中的数据存储在数组a中,然后与file2中的数据进行匹配输出。
awk支持复杂的逻辑判断,如筛选包含特定错误且值超过阈值的日志条目:
awk '{if ($3=="ERROR" && $5>10) print $0}' server.log
这里,$3和$5分别是第三和第五个字段,脚本仅输出同时满足这两个条件的行。
awk允许定义函数,实现更复杂的逻辑,如计算斐波那契数列:
awk 'function fib(n) {if (n<=2) return 1; else return fib(n-1)+fib(n-2)} BEGIN {for(i=1;i<=10;i++) print fib(i)}'
这段代码定义了一个计算斐波那契数的函数,并在BEGIN块中调用它。
在处理大数据量时,awk的性能优化至关重要。例如,减少重复计算和逐行处理大文件:
awk '{sum+=$2} END {print "总和:", sum}' data.txt
通过逐行累加,避免一次性加载整个文件到内存,有效降低内存消耗。
awk以其强大的文本处理能力,成为Linux运维人员不可或缺的工具。掌握awk,能有效提升处理文本数据的效率和灵活性。