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{后处理}' 文件名
  1. BEGIN{}:在读取文件前执行(初始化变量、打印表头)。
  2. 模式{动作}:逐行扫描文件,若行匹配「模式」则执行「动作」(可省略模式,默认处理所有行)。
  3. 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
© 蓝易云.