Linux常用命令awk
IDC服务
Linux常用命令awk
2025-06-04 00:05
awk 是 Linux 文本处理的三剑客之一(grep、sed、awk),专精于结构化数据解析、统计与格式化输出。其核心在于模式扫描与处理语言,适用于日志分析、报表生成、数据清洗等场景。以下是深度技术解析: ? 一、核心概念:awk 的执行逻辑
awk
是 Linux 文本处理的三剑客之一(grep、sed、awk),专精于结构化数据解析、统计与格式化输出。其核心在于模式扫描与处理语言,适用于日志分析、报表生成、数据清洗等场景。以下是深度技术解析:
🧠 一、核心概念:awk
的执行逻辑
awk 'BEGIN{预处理} 模式{动作} END{后处理}' 文件名
BEGIN{}
:在读取文件前执行(初始化变量、打印表头)。
模式{动作}
:逐行扫描文件,若行匹配「模式」则执行「动作」(可省略模式,默认处理所有行)。
END{}
:处理完所有行后执行(汇总结果)。
🔑 二、核心能力与内置变量
⚙️ 内置变量(常用)
变量 | 含义 | 示例 |
---|---|---|
$0 |
整行内容 | {print $0} |
$1,$2,...$n |
第 n 个字段(默认空格分隔) | {print $1} |
NF |
当前行字段数量 | {print $NF} (打印最后一个字段) |
NR |
当前处理的行号(累计) | NR==1{print} (打印首行) |
FNR |
当前文件的行号(多文件独立) | FNR==1{print FILENAME} |
FS |
输入字段分隔符(默认空格) | BEGIN{FS=":"} |
OFS |
输出字段分隔符(默认空格) | BEGIN{OFS="-"} |
RS |
输入行分隔符(默认换行) | BEGIN{RS=";"} |
ORS |
输出行分隔符(默认换行) | BEGIN{ORS="\n\n"} |
FILENAME |
当前处理的文件名 | END{print FILENAME} |
🛠️ 内置函数
函数 | 用途 | 示例 |
---|---|---|
length(s) |
字符串长度 | {print length($1)} |
substr(s,start,len) |
截取子串 | {print substr($1,1,3)} |
gsub(/old/,"new") |
全局替换 | {gsub(/foo/,"bar"); print} |
split(s,arr,sep) |
分割字符串到数组 | {split($0,arr,":"); print arr[1]} |
tolower(s) /toupper(s) |
大小写转换 | {print tolower($1)} |
int(x) |
取整数部分 | {print int($3)} |
rand() |
生成 0~1 随机数 | BEGIN{print rand()} |
sprintf(fmt,...) |
格式化输出(类似 C 语言) | {print sprintf("%.2f", $2)} |
🚀 三、实战高频场景示例
1️⃣ 基础提取与格式化
# 提取 /etc/passwd 用户名和登录Shell(冒号分隔)
awk -F: '{print "用户:", $1, "=> Shell:", $NF}' /etc/passwd
# 输出时用制表符分隔字段
awk -F: -v OFS='\t' '{print $1, $3, $6}' /etc/passwd
2️⃣ 条件过滤
# 显示内存占用 >100MB 的进程 (ps 输出第6列为 RSS)
ps aux | awk '$6 > 102400 {print $0}'
# 匹配包含 "error" 的行(忽略大小写)
awk 'tolower($0) ~ /error/ {print NR ":" $0}' log.txt
3️⃣ 数据统计与计算
# 计算文件行数、空行数
awk 'BEGIN{total=0; empty=0} {total++} $0 ~ /^$/ {empty++} END{print "总行:", total, "空行:", empty}' file.txt
# 统计 Nginx 日志各状态码次数
awk '{status[$9]++} END{for(s in status) print s, status[s]}' access.log
4️⃣ 字段重组与处理
# 合并姓名(第2列+空格+第1列)
awk '{print $2 " " $1}' data.txt
# 将 IP 地址第三段替换为 XXX
awk -F. 'BEGIN{OFS="."} {$3="XXX"; print}' ip_list.txt
5️⃣ 多文件关联处理
# 合并两个文件(按第一列连接)
awk 'NR==FNR{a[$1]=$2; next} $1 in a {print $0, a[$1]}' file1.txt file2.txt
NR==FNR
:仅在处理第一个文件时为真a[$1]=$2
:将 file1 的第一列作为键,第二列作为值存入数组next
:跳过后续动作,继续读取下一行$1 in a
:在 file2 中匹配 file1 存在的键
标签:
- Linux
- awk