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在所有输入文本处理完后执行。

示例

1. 打印指定列

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

awk '{print $1,$4,$7}' access.log

2. 过滤日志

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

awk '$9~/^(500|404)$/{print $0}' access.log

3. 按条件统计

统计访问量最高的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

4. 指定多个分隔符

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

awk -F '[:/]' '{print $1,$5}' /etc/passwd

5. 日志切割

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

awk '{split($4,array,"[:/]");file=array[2]array[3]substr(array[4],1,2)".log";print $0 >> file}' nginx.log

6. 匹配指定列

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

awk '$2 ~ /^Tom$/' student.txt

7. 统计文件大小

统计/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的语法和常见用法,建议在实践中多思考应用场景,熟练使用必能让你在数据分析和问题排查时如虎添翼。