AI摘要:本文详细介绍了Linux下的文本处理工具awk的使用方法,包括其语法、选项参数、内置变量、常用操作(如打印、条件判断、循环等)以及一些实用的示例。awk通过将文本按行读取并以指定的分隔符分割成多个字段,使得对文本的处理变得灵活高效。文章还提供了如何打印指定列、过滤日志、按条件统计、指定多个分隔符、日志切割、匹配指定列和统计文件大小等实际应用示例,以及一个统计nginx日志数据的awk脚本示例。通过这些内容,读者可以全面掌握awk命令的强大功能,有效地应用于日志分析、数据处理等场景。
Linux awk命令详细教程
awk是一种优秀的文本处理工具,在Linux系统日志分析、数据处理等场景广泛使用。本文详细介绍awk命令的用法,助你全面掌握这一利器。
语法
awk [选项参数] 'script' 文件名
awk处理文本时,将每一行视为一条记录,每条记录以分隔符划分为多个字段。awk读取文件后,依次对每一行执行script
中的命令,并输出结果。
选项参数
-F fs
: 指定输入分隔符,可使用字符串或正则表达式,默认为空格或tab。-v var=value
: 定义变量并赋值,在脚本中可直接使用。-f scripfile
: 从脚本文件中读取awk命令,免去命令行输入。-o
:输出文件名作为结果保存。-c
:只输出awk处理行的数量。内置变量
变量 | 描述 |
---|---|
$0 | 整行内容 |
$1 ~ $n | 当前行的第1 ~ n个字段 |
NF | 当前行的字段个数,即列数 |
NR | 当前处理的行数,从1开始 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
FS | 输入字段分隔符,默认为空格 |
OFS | 输出字段分隔符,默认为空格 |
RS | 输入记录分隔符,默认为换行符 |
ORS | 输出记录分隔符,默认为换行符 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数 |
常用action
awk中的action可以是打印、流程控制、数学运算等,以下是一些常见用法:
print
:打印指定内容到标准输出。printf
:格式化输出。if/else
:条件语句。while
:while循环。for
:for循环。next
:跳过当前行。exit
:退出。可在{}
内定义多个命令,用;
隔开。BEGIN和END是特殊的关键字,BEGIN在所有输入文本处理前执行,END在所有输入文本处理完后执行。
示例
假设access.log
的字段依次为ip、time、method、url、http_version、status_code、body_bytes_sent,打印每行第1、4、7列:
awk '{print $1,$4,$7}' access.log
打印响应状态码为500或404的日志记录:
awk '$9~/^(500|404)$/{print $0}' access.log
统计访问量最高的10个IP:
awk '{count[$1]++}END{print "IP\tCount";for(ip in count)print ip,"\t",count[ip]}' access.log | sort -k2 -nr | head -10
以冒号:
或者斜杠/
分隔/etc/passwd
的每一行,打印第1、5列:
awk -F '[:/]' '{print $1,$5}' /etc/passwd
将nginx.log
按小时切割,小时精确到10位:
awk '{split($4,array,"[:/]");file=array[2]array[3]substr(array[4],1,2)".log";print $0 >> file}' nginx.log
在student.txt
中筛选第2列值为Tom
的行:
awk '$2 ~ /^Tom$/' student.txt
统计/home
目录下用户目录的大小:
awk 'BEGIN{printf "%-15s %-15s %-15s\n","User","Home","Size(MB)"}{split($2,path,"/");size=sprintf("%.2f",$3/1024/1024);printf "%-15s %-15s %-15s\n", path[3],path[2]"/"path[3],size}' <(du -sb /home/*)
附:awk脚本示例
将以下脚本保存为nginx_monitor.awk
:
# 统计nginx日志的流量、请求数、各状态码数量
BEGIN {
print "统计nginx日志数据"
}{
total_size += $10
req++
status_code[$9]++
}END{
printf "Total Requests: %d\nTotal Size: %.2f MB\n", req, total_size/1024/1024
print "[Status Code] Count"
for(code in status_code){
printf " %-9s %d\n", code, status_code[code]
}
}
执行:
awk -f nginx_monitor.awk access.log
小结
awk作为Linux文本三剑客之一,有着出色的数据处理能力。本文全面介绍了awk的语法和常见用法,建议在实践中多思考应用场景,熟练使用必能让你在数据分析和问题排查时如虎添翼。
版权属于:瞳瞳too
本文链接:https://cloud.tencent.com/developer/article/2397225
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!