2020-10-08 16:29:05
AWK是Linux中高效处理文本数据的强大工具,通过灵活的语法和内置功能,可快速完成数据提取、统计分析和报表生成等任务。 以下是AWK的核心用法和应用场景的详细说明:
一、基础语法与核心概念命令结构
awk [-F 分隔符] 'pattern {action}' input_file(s)-F:指定字段分隔符(默认空格/制表符),如-F ':'用于解析/etc/passwd。
pattern:匹配条件(如正则表达式或比较操作),可省略。
action:对匹配行执行的操作(如打印字段、计算等)。
字段与内置变量
$0:整行内容,$1、$2…为第1、2…个字段。
常用内置变量:
NR:当前行号(从1开始)。
NF:当前行的字段数。
FILENAME:当前文件名。
FS:输入字段分隔符(等价于-F)。
提取特定字段
显示/etc/passwd的用户名(第1列):awk -F ':' '{print $1}' /etc/passwd
显示第1列和第7列,并添加表头和表尾:awk -F ':' 'BEGIN {print "start1,start7"} {print $1 "," $7} END {print "end1,end7"}' /etc/passwd
统计行信息
输出每行的行号、字段数及完整内容:awk -F ':' '{print NR " " NF " " $0}' /etc/passwd
字符串处理函数
length(s):返回字符串长度。awk 'BEGIN {print length("hello")}' # 输出5
toupper(s)/tolower(s):转换大小写。awk -F ':' '{print toupper($1)}' /etc/passwd # 用户名转为大写
条件与流程控制
正则匹配:显示包含daemon的行。awk -F ':' '$0 ~ /daemon/' /etc/passwd
比较操作:输出第1个字段首字母大于d的用户名。awk -F ':' '{if ($1 > "d") print $1; else print "-"}' /etc/passwd
脚本文件:将条件逻辑写入脚本(如test.awk),通过-f调用。awk -F ':' -f test.awk /etc/passwd
数学运算
计算每行的字段数总和:awk -F ':' '{sum += NF} END {print sum}' /etc/passwd
日志分析
提取Nginx日志中的IP和状态码:awk '{print $1, $9}' access.log
系统管理
批量终止进程:通过jps获取Java进程PID并终止。kill -9 $(jps -l | grep 'weibo-interface-1.0.jar' | awk '{print $1}')
关闭Hadoop DataNode:SSH到各节点执行:ssh node1 "kill $(jps | grep 'DataNode' | awk '{print $1}')"
数据报表生成
统计用户分组信息(如按UID范围分类):awk -F ':' '$3 < 1000 {print $1 " is system user"} $3 >= 1000 {print $1 " is normal user"}' /etc/passwd
AWK的强大之处在于其简洁的语法和丰富的内置功能,能够高效处理结构化文本数据。通过灵活组合字段提取、条件判断和数学运算,可快速完成日志分析、系统监控等任务。建议从简单命令入手,逐步掌握变量、函数和流程控制,最终实现复杂数据处理自动化。