--- #领域/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(首选)。