前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux awk命令详细教程

Linux awk命令详细教程

作者头像
曈曈too
发布2024-03-16 11:47:24
2640
发布2024-03-16 11:47:24
举报
文章被收录于专栏:瞳瞳too的学习笔记

AI摘要:本文详细介绍了Linux下的文本处理工具awk的使用方法,包括其语法、选项参数、内置变量、常用操作(如打印、条件判断、循环等)以及一些实用的示例。awk通过将文本按行读取并以指定的分隔符分割成多个字段,使得对文本的处理变得灵活高效。文章还提供了如何打印指定列、过滤日志、按条件统计、指定多个分隔符、日志切割、匹配指定列和统计文件大小等实际应用示例,以及一个统计nginx日志数据的awk脚本示例。通过这些内容,读者可以全面掌握awk命令的强大功能,有效地应用于日志分析、数据处理等场景。

Linux awk命令详细教程

awk是一种优秀的文本处理工具,在Linux系统日志分析、数据处理等场景广泛使用。本文详细介绍awk命令的用法,助你全面掌握这一利器。

语法

代码语言:javascript
复制
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在所有输入文本处理完后执行。

示例

  1. 打印指定列

假设access.log的字段依次为ip、time、method、url、http_version、status_code、body_bytes_sent,打印每行第1、4、7列:

代码语言:javascript
复制
awk '{print $1,$4,$7}' access.log
  1. 过滤日志

打印响应状态码为500或404的日志记录:

代码语言:javascript
复制
awk '$9~/^(500|404)$/{print $0}' access.log
  1. 按条件统计

统计访问量最高的10个IP:

代码语言:javascript
复制
awk '{count[$1]++}END{print "IP\tCount";for(ip in count)print ip,"\t",count[ip]}' access.log | sort -k2 -nr | head -10
  1. 指定多个分隔符

以冒号:或者斜杠/分隔/etc/passwd的每一行,打印第1、5列:

代码语言:javascript
复制
awk -F '[:/]' '{print $1,$5}' /etc/passwd
  1. 日志切割

nginx.log按小时切割,小时精确到10位:

代码语言:javascript
复制
awk '{split($4,array,"[:/]");file=array[2]array[3]substr(array[4],1,2)".log";print $0 >> file}' nginx.log
  1. 匹配指定列

student.txt中筛选第2列值为Tom的行:

代码语言:javascript
复制
awk '$2 ~ /^Tom$/' student.txt
  1. 统计文件大小

统计/home目录下用户目录的大小:

代码语言:javascript
复制
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:

代码语言:javascript
复制
# 统计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]
  }
}

执行:

代码语言:javascript
复制
awk -f nginx_monitor.awk access.log

小结

awk作为Linux文本三剑客之一,有着出色的数据处理能力。本文全面介绍了awk的语法和常见用法,建议在实践中多思考应用场景,熟练使用必能让你在数据分析和问题排查时如虎添翼。

版权属于:瞳瞳too

本文链接:https://cloud.tencent.com/developer/article/2397225

本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档