
---
#领域/Linux 

#复盘/1

## 一句话描述

[____awk 使用说明____]

---

## 核心规范

>空想不如行动，积累胜于苛求。
>实践 > 沉淀 > 完美主义

实践不是盲目行动，而是带着“小目标、可验证“的方向试错，实践后必须沉淀（比如记录问题、总结规律），否则就是低水平重复。

实践大于沉淀，沉淀大于完美；完美是沉淀的终局方向，沉淀是实践的复盘产物；分域施策，避坑落地，始于行动，终于迭代。

---

## 三省沉淀法

- 达成了[__对 awk 命令的基本了解______]目标
- 遇到了[_日常没有使用习惯_______]问题
- 下次改进[__逐步去尝试编写脚本______]

## 个人理解

[__awk 的视野只有一行 N 个字段，对 N 个字段进行判断、过滤、输出等操作，并将操作应用到每一行______]

## 实践计划

#状态/待实践 

1. [__awk 编写一些查询的小脚本______]
2. [________]
3. [________]

## 核心定义

awk 是一门面向文本的编程语言，当作命令行工具，按「行」读取文本、按「列」分割文本，实现文本过滤、字段提取、数据计算、格式化输出

核心工作原理：逐行处理、循环执行

1. 读取一行内容到内存
2. 默认分割符分割字段/列
3. 执行awk指令（过滤、提取、计算）
4. 读取下一行，重复 1-4

>行为整体，分割后的字段/列为独立单元

## 基本使用

```bash

find . -name '*.log' | awk '{print}'
ps -ef | awk '{print $2}'

# 自定义分隔符
awk -F'分隔符' '处理脚本' 文件名/管道
awk -F: '{print $1,$2}' /etc/passwd
awk -F, ... # ,分割
awk -F' +' ... # 匹配正则，一个或多个空格

# 行筛选（条件过滤）
ls -l | awk '!/txt/ {print $9}' # 不包含 txt 的行

# 条件判断

ls -l | awk '$5 < 2000 {print $9}' # 文件字节小于 2000 的文件名称

ls -l | awk '{print $NF}' # 最后一列，永远是文件名


awk '{FS=":"; print $1}' /etc/passwd # 设置分隔符

awk -F: '{OFS="_"; print $1,$5}' /etc/passwd # 设置输出分隔符

ls -l | awk '{printf "%-10s %s\n", $5, $9}' # 对齐等精准格式

```


| 选项           | 说明                        |
| ------------ | ------------------------- |
| $0           | 代表整行内容                    |
| $1~n         | 代表第n列/第n字段                |
| -F           | 自定义分隔符                    |
| /匹配规则/       | 行筛选                       |
| !/匹配规则/      |                           |
| $3 == "root" | 条件判断                      |
| NF           | 当前总列数                     |
| NR           | 当前行号                      |
| FS=":"       | 字段分割符，等同于 -F:，但貌似第一行会不起作用 |
| OFS          | 输出分隔符                     |
| printf       | 精准格式化输出                   |

## 进阶使用

```bash
# 三段式执行结构
awk '
BEGIN { 初始化操作 }
{ 逐行处理的核心逻辑 }
END { 处理完成后的汇总操作 }
' 文件名/管道
```

三段式的执行规则

BEGIN 模块：读取文本之前，只执行一次
{} 主体模块：awk 逐行读取时，每读一行执行一次
END{} 模块：所有文本处理完成后，只执行一次

```bash
awk 'END{print NR}' /etc/passwd # 统计总行数

# 普通文件的总大小，求和第5列的数值
ls -l | awk '{sum += $5} END{print "总大小: ", sum, "字节"}'

# 案例3：处理/etc/passwd，先打印表头，再输出内容，最后统计总行数（完美三段式） 
awk -F: '
BEGIN{print "=====系统用户列表=====\n用户名\t\tUID"}
{print $1, "\t\t", $3}
END{print "=====总计", NR, "个用户====="} 
' /etc/passwd

# 案例4：统计 Nginx 日志中「状态码404的请求总数」 
awk '$9 == 404 {count++} END{print "404请求数：", count}' /var/log/nginx/access.log

```

## ✅ awk 与 find/xargs/-exec 的「黄金联动案例」

```bash
# 案例1：find 找文件 + awk 提取文件名 + xargs 批量删除（精准删除）
find . -type f -name "*.log" | awk '{print $0}' | xargs rm -rf

# 案例2：ps 查进程 + awk 提取PID + xargs 批量杀进程（生产最常用）
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9

# 案例3：find 找文件 + awk 筛选大小大于100M的文件 + xargs 移动到指定目录
find . -type f -print0 | xargs -0 ls -l | awk '$5 > 104857600 {print $NF}' | xargs mv -t /tmp/bigfile

# 案例4：统计当前目录下所有 .log 文件的总大小
find . -name "*.log" -exec ls -l {} \; | awk '{sum += $5} END{print "日志总大小：", sum/1024/1024, "MB"}'
```

## ✅ awk 高频实用案例大全

```bash
# 1. 提取本机所有IP地址
ifconfig | awk '/inet / {print $2}'

# 2. 提取内存使用率（free命令）
free -m | awk '/Mem:/ {print "内存使用率：", $3/$2*100, "%"}'

# 3. 提取磁盘使用率（df命令），筛选使用率大于80%的分区
df -h | awk '/\/dev/ {gsub("%",""); if($5>80) print $1,$5"%"}'

# 4. 批量修改文件名，去掉所有文件的 .bak 后缀（联动find+awk+mv）
find . -name "*.bak" | awk '{print "mv "$0" "$(NF-1)}' | sh

# 5. 统计日志中每个IP的访问次数，并排序（高频日志分析）
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

# 6. 筛选日志中耗时大于1000ms的请求
awk '$NF > 1000 {print $0}' /var/log/java/app.log

# 7. 输出/etc/passwd中UID大于1000的普通用户
awk -F: '$3 > 1000 {print $1}' /etc/passwd

# 8. 统计当前目录下文件的个数
ls -l | awk '/^-/{count++} END{print count}'

# 9. 统计当前目录下目录的个数
ls -l | awk '/^d/{count++} END{print count}'

#10. 提取进程的CPU使用率和进程名
ps -aux | awk '{print $3"%", $11}'
```

## ✅ awk 核心知识点 浓缩总结

### ✔️ 核心本质

awk 是面向文本的编程语言，核心是「**按行读、按列分、逐行处理**」，主打文本分析和数据统计。

### ✔️ 必记语法（3 个核心）

1. 字段占位符：`$0`整行，`$1`第 1 列，`$n`第 n 列，`$NF`最后一列，索引从 1 开始；
2. 自定义分隔符：`awk -F'分隔符' '脚本'`；
3. 三段式结构：`BEGIN{初始化} {逐行处理} END{汇总}`，执行顺序固定。

### ✔️ 必记内置变量（5 个）

`NF` 总列数、`NR` 行号、`FS` 输入分隔符、`OFS` 输出分隔符、`FILENAME` 文件名。

### ✔️ 必记核心用法

1. 字段提取：`awk '{print $1,$3}'`；
2. 条件筛选：`awk '$5>100 {print}'`；
3. 正则匹配：`awk '/关键词/ {print}'`；
4. 数据统计：`awk '{sum+=$n} END{print sum}'`。

### ✔️ 选型建议（三剑客怎么选）

- 只过滤关键词 → 用 grep；
- 只批量替换文本 → 用 sed；
- 提取列 / 筛选条件 / 数据统计 → 用 awk（首选）。


