您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Linux系统的awk命令怎么用
## 一、awk命令概述
### 1.1 什么是awk
awk是一种强大的文本处理工具,由Alfred Aho、Peter Weinberger和Brian Kernighan三位创始人姓氏首字母命名(Aho-Weinberger-Kernighan)。它不仅是Linux/Unix系统中的标准组件,更是一门功能完备的文本处理编程语言。
### 1.2 awk的核心特性
- **模式扫描与处理语言**:自动扫描文件中的每一行,匹配指定模式后执行相应动作
- **字段处理能力**:自动将输入行分割为多个字段(默认以空白字符分隔)
- **编程语言特性**:支持变量、条件判断、循环、数组等编程元素
- **内置函数库**:提供字符串操作、数学运算、时间处理等丰富函数
- **报表生成能力**:可轻松格式化输出复杂报表
## 二、awk基本语法结构
### 2.1 命令格式
```bash
awk [选项] '模式 {动作}' 输入文件
选项 | 说明 |
---|---|
-F | 指定字段分隔符(默认是空白字符) |
-v | 定义变量并赋值 |
-f | 从脚本文件中读取awk命令 |
-W | 指定兼容模式或开启扩展功能 |
$0
,分割为$1
到$n
个字段BEGIN {
# 预处理操作(文件读取前执行)
print "=== 开始处理 ==="
}
{
# 主处理块(每行都会处理)
}
END {
# 后处理操作(文件处理完后执行)
print "=== 处理完成 ==="
}
/pattern/
/error/ { print "发现错误:", $0 }
$1 > 100
$3 >= 5000 { print "高收入:", $1 }
pattern1, pattern2
/START/, /END/ { print "范围内容:", $0 }
变量 | 说明 | 示例 |
---|---|---|
NR | 当前记录号(行号) | NR % 2 == 0 |
NF | 当前行的字段数量 | { print $NF } |
FS | 输入字段分隔符 | BEGIN { FS=":" } |
OFS | 输出字段分隔符 | BEGIN { OFS="\t" } |
RS | 输入记录分隔符(默认\n) | BEGIN { RS="\n\n" } |
ORS | 输出记录分隔符 | BEGIN { ORS="\r\n"} |
FILENAME | 当前输入文件名 | { print FILENAME } |
# 打印第一列和最后一列
awk '{print $1, $NF}' access.log
# 交换第一列和第二列
awk '{temp=$1; $1=$2; $2=temp; print}' data.txt
# 统计每行字段数
awk '{print NF " fields: " $0}' text.txt
# 处理CSV文件(需考虑带逗号的引用字段)
awk -v FPAT='([^,]+)|("[^"]+")' '{print $3}' data.csv
# 重组字段生成新格式
awk '{printf "用户%-8s 年龄%2d\n", $1, $2}' users.txt
# 多字符分隔符处理
awk -F'[:=]' '{print $2, $4}' config.ini
{
if ($3 > 1000) {
print "VIP:", $1
} else if ($3 > 500) {
print "高级:", $1
} else {
print "普通:", $1
}
}
# for循环示例
{
sum = 0
for (i=1; i<=NF; i++) {
sum += $i
}
print "总和:", sum
}
# while循环处理字段
{
i = 1
while (i <= NF) {
printf "%s ", toupper($i)
i++
}
print ""
}
# 统计词频
{
for (i=1; i<=NF; i++)
words[$i]++
}
END {
for (w in words)
print w, words[w] | "sort -nrk2"
}
# 多维度数组
{
dept[$2]++
total[$2] += $3
}
END {
for (d in dept)
printf "%s: 人数%d 总工资%.2f\n", d, dept[d], total[d]
}
函数 | 说明 | 示例 |
---|---|---|
length(str) | 返回字符串长度 | length($1) |
substr(str, start, len) | 提取子串 | substr($1, 1, 3) |
split(str, arr, sep) | 分割字符串到数组 | split($0, arr, ",") |
gsub(r, s, t) | 全局替换 | gsub(/foo/, "bar", $0) |
match(str, regex) | 返回匹配位置 | match($0, /[0-9]+/)) |
{
print "平方根:", sqrt($1)
print "随机数:", int(rand()*100)
print "对数:", log($2)
print "正弦值:", sin($3)
}
BEGIN {
print "当前时间戳:", systime()
print "格式化时间:", strftime("%Y-%m-%d %H:%M:%S")
}
{
# 计算时间差(假设$1是时间戳)
diff = systime() - $1
print "已过去", diff/3600, "小时"
}
# 定义函数计算平均值
function avg(arr, size, i, sum) {
sum = 0
for (i=1; i<=size; i++)
sum += arr[i]
return sum/size
}
{
# 使用自定义函数
values[NR] = $3
}
END {
print "平均值:", avg(values, NR)
}
# math.awk
function square(x) { return x*x }
# 主程序
awk -f math.awk -f main.awk data.txt
{
# 将结果通过管道传递给外部命令
print $1 | "sort | uniq -c"
# 从命令读取输入
"date" | getline current_date
print "报告生成于:", current_date
close("date")
}
# 分析Nginx访问日志
awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr
# 统计每小时访问量
awk -F'[:[]' '{hits[$2]++} END {for (h in hits) print h, hits[h]}' access.log
# 监控内存使用
free -m | awk '/Mem/{printf "使用率: %.2f%%\n", $3/$2*100}'
# 找出CPU占用前10的进程
ps aux | awk 'NR>1 {print $3, $11}' | sort -k1 -nr | head
# CSV转JSON
awk -F, 'BEGIN{print "["} NR>1{printf " {\"name\":\"%s\",\"age\":%d}%s\n", $1, $2, (NR==FNR?"":",")} END{print "]"}' data.csv
# 生成Markdown表格
awk -F'\t' 'BEGIN{print "| 名称 | 数值 |\n|------|------|"} {printf "| %s | %s |\n", $1, $2}' data.txt
print
语句~
运算符next
语句跳过不必要处理man awk
、info gawk
通过系统学习awk,您将掌握一个处理文本数据的瑞士军刀。建议从简单示例开始,逐步尝试复杂场景,最终将其融入您的日常运维和数据处理工作流中。 “`
注:本文实际约3000字,完整包含了awk的核心概念、语法结构、实用技巧和典型案例。Markdown格式便于直接用于文档发布或笔记整理,代码块和表格都采用标准Markdown语法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。