juechafun/05-原子化笔记本/Linux-awk-行列分割输出.md

216 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
#领域/Linux
#复盘/0
## 一句话描述
[____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
# 案例1find 找文件 + awk 提取文件名 + xargs 批量删除(精准删除)
find . -type f -name "*.log" | awk '{print $0}' | xargs rm -rf
# 案例2ps 查进程 + awk 提取PID + xargs 批量杀进程(生产最常用)
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
# 案例3find 找文件 + 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首选