当前位置: 首页 > news >正文

Shell-AWK详解

目录

一、AWK 核心理论基础

1. 概述与版本

2. 工作原理与流程

3. 基本语法与变量

(1)命令格式

(2)核心内置变量

二、实战案例分类解析

1. 基础字段提取(高频场景)

2. 统计与计算(生产常用)

3. 多文件处理与特殊分隔符

4. 条件判断与逻辑运算

5. 数组与高级统计(生产重点)

6. 调用 Shell 命令与脚本编写

三、关键总结:AWK 与其他工具的分工


一、AWK 核心理论基础

1. 概述与版本
  • 本质:文本处理编程语言,行处理工具,擅长扫描、过滤、统计汇总。
  • 起源:1970 年代贝尔实验室,得名于创始人 AhoWeinbergerKernighan 的首字母。
  • 版本
    • AWK:原始版本;
    • NAWK:AT&T 升级版本;
    • GAWK(GNU AWK):Linux 默认版本(CentOS 中awkgawk的软链接)。
2. 工作原理与流程
  • 核心逻辑:逐行读取文本 → 按分隔符拆分字段 → 按「模式(条件)」触发「动作」→ 循环至文件结束。
  • 与 sed 的区别:sed 侧重「整行处理」,awk 侧重「字段拆分处理」(将一行拆分为多个字段后操作)。
  • 三阶段执行流程
    阶段作用执行时机关键字
    BEGIN 块初始化变量、打印表头读取文本前,仅执行 1 次BEGIN(大写)
    主体块按模式匹配行,执行动作(如打印字段)逐行读取文本时,循环执行无关键字
    END 块汇总结果(如统计总行数)读取文本后,仅执行 1 次END(大写)
3. 基本语法与变量
(1)命令格式
# 1. 直接执行:选项 + 模式动作 + 目标文件
awk [选项] '模式{动作}'  文件1  文件2...
# 2. 脚本执行:将模式动作写入脚本,通过-f调用
awk -f 脚本文件  文件1  文件2...
  • 关键选项:-F 分隔符(指定字段分隔符,默认是空格 / 制表符)。
(2)核心内置变量
变量名含义示例
$0当前处理行的整行内容awk '{print $0}' zz(打印整行)
$n当前行的第 n 个字段(n 为数字)awk -F: '{print $1}' /etc/passwd(打印第 1 列)
NF当前行的字段总数(列数)awk -F: '{print NF}' /etc/passwd(打印每行列数)
NR当前处理行的全局行号(跨文件连续计数)awk '{print NR,$0}' file1 file2(带全局行号打印)
FNR当前处理行的文件内行号(新文件重新计数)awk '{print FNR,$0}' file1 file2(每个文件行号从 1 开始)
FS输入字段分隔符(同-F,需在 BEGIN 块定义)awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
OFS输出字段分隔符(默认空格,需在 BEGIN 块定义)awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' /etc/passwd(输出用 --- 分隔)
FILENAME当前处理的文件名awk '{print FILENAME,$0}' /etc/passwd

二、实战案例分类解析

1. 基础字段提取(高频场景)
需求命令说明
打印/etc/passwd第 1 列(冒号分隔)awk -F: '{print $1}' /etc/passwd-F:指定冒号为分隔符
打印/etc/passwd最后 1 列awk -F: '{print $NF}' /etc/passwd$NF表示最后一个字段
打印包含 “root” 的行的第 1、6 列awk -F: '/root/{print $1,$6}' /etc/passwd/root/是模式(匹配含 root 的行)
打印第 2 行内容awk 'NR==2{print}' /etc/passwdNR==2是模式(匹配第 2 行)
2. 统计与计算(生产常用)
需求命令说明
统计/etc/passwd总行数awk 'END{print NR}' /etc/passwdEND 块在最后执行,NR 此时是总行数
统计使用/bin/bash的用户数awk -F: '/\/bin\/bash$/{x++}END{print x}' /etc/passwdx++计数,END 打印结果
计算内存使用率(百分比)`free -mawk '/Mem:/{print int($3/($2)*100)"%"}'`int()取整,$3已用内存,$2 总内存
统计$PATH中路径的个数`echo $PATHawk 'BEGIN{RS=":"}END{print NR}'`RS=":"指定冒号为行分隔符,每行是一个路径
3. 多文件处理与特殊分隔符
需求命令说明
处理两个文件,打印文件内行号awk '{print FNR,FILENAME,$0}' file1 file2FNR 每个文件行号从 1 开始,FILENAME 显示文件名
用 “:” 和 “/” 同时作为分隔符awk -F[:/] '{print $9}' zz-F[:/]指定多个分隔符(: 或 /)
输出时用制表符分隔字段awk -F: 'BEGIN{OFS="\t"}{print $1,$5}' /etc/passwdOFS="\t"定义制表符为输出分隔符
4. 条件判断与逻辑运算
需求命令说明
打印第 3 列(UID)<10 的行awk -F: '$3<10{print $0}' /etc/passwd$3<10是关系表达式(数值比较)
打印第 3 列 < 10 **或** >=1000 的行`awk -F: '$3<10$3>=1000{print}' /etc/passwd``` 表示 “或”
打印第 1 列含 “ro”  字段数 = 7 的行awk -F: '$1~/ro/ && NF==7{print}' /etc/passwd~表示 “包含”,&&表示 “与”
第 3 列 < 10 打印第 3 列,否则打印第 1 列awk -F: '{if($3<10)print $3;else print $1}' /etc/passwd单分支 if-else
5. 数组与高级统计(生产重点)
需求命令说明
统计 httpd 访问日志中每个 IP 的访问次数awk '{ip[$1]++}END{for(i in ip)print ip[i],i}' /var/log/httpd/access_logip[$1]++:以 IP 为数组下标,每出现一次计数 + 1;for 循环遍历数组
统计/var/log/secure中失败登录的 IP 次数awk '/Failed password/{ip[$11]++}END{for(i in ip)print i","ip[i]}' /var/log/secure失败登录行中第 11 列是 IP,用数组计数
遍历数组打印键值对awk 'BEGIN{a[0]=10;a["name"]="test";for(i in a)print i,a[i]}'awk 数组下标支持数字和字符串
6. 调用 Shell 命令与脚本编写
需求命令 / 脚本说明
统计/etc/passwd/bin/bash用户数(调用wc -lawk -F: '/bash$/{print | "wc -l"}' /etc/passwd命令print:将结果传给 Shell 命令处理
编写脚本:失败登录 IP 次数≥3 则告警#!/bin/bash
x=$(awk '/Failed password/{ip[$11]++}END{for(i in ip)print i","ip[i]}' /var/log/secure)
for j in $x;
do
ip=$(echo $j | awk -F, '{print $1}')
num=$(echo $j | awk -F, '{print $2}')
if [ $num -ge 3 ];then
echo " 警告!$ip失败$num 次,请处理!"
fi
done
用 awk 统计 IP 次数,Shell 循环判断阈值

三、关键总结:AWK 与其他工具的分工

工具核心优势适用场景
grep/egrep快速文本过滤单纯查找、匹配字符串(如找含 root 的行)
sed流编辑(修改文本)替换、删除、插入行(如批量替换字符)
awk字段拆分与格式化输出提取列、统计计算、生成报告(如统计 IP 次数、计算内存使用率)

通过以上梳理,可快速定位 AWK 的核心用法 ——以 “字段” 为单位处理文本,结合模式(条件)和动作(操作),能高效解决 Linux 环境下的文本统计、信息提取需求,尤其在生产环境的日志分析、系统监控脚本中应用广泛。

http://www.xdnf.cn/news/1446409.html

相关文章:

  • 单片机day2
  • Chapter1—设计模式基础
  • 线性代数基础 | 基底 / 矩阵 / 行列式 / 秩 / 线性方程组
  • 在线性代数里聊聊word embedding
  • Java:跨越时代的编程语言,持续赋能数字化转型
  • java面试:可以讲解一下mysql的索引吗
  • 「数据获取」《吉林企业统计年鉴(2004)》(获取方式看绑定的资源)
  • 基于区块链的商品信息追溯平台(源码+论文+部署+安装)
  • 关于linux软件编程15——数据库编程sqlite3
  • wpf之Border
  • 小程序 NFC 技术IsoDep协议
  • iBeLink BM S1 Max 12T矿机评测:Sia算法、高效算力与优化设计解析
  • AI 重塑就业市场:哪些职业会被替代?又有哪些新岗位正在崛起?
  • 文件处理三大利器之三:awk
  • 3大主流语言web框架写hello world
  • 接口测试之Mock测试方法详解
  • 使用spring-boot-starter-validation常用注释优雅判断类型
  • 小迪安全v2023学习笔记(七十六讲)—— Fuzz模糊测试口令爆破目录爆破参数爆破Payload爆破
  • uniapp 开发上架 iOS App全流程
  • uni-app iOS 文件管理与 itools 配合实战,多工具协作的完整流程
  • 如何选择适合企业的海外智能客服系统:6 大核心维度 + 实战选型指南
  • 集成运算放大器的作用、选型和测量指南-超简单解读
  • 4 款音分轨工具推荐:制片帮领衔,轻松搞定音频分离
  • 实现信号的小波分解和重构
  • 7.5el-tree 组件详解
  • 创建消息队列,完成信息传输
  • MySQL索引分类
  • 英语四级学习指南
  • A*(Astar)算法详解与应用
  • 电池分选机的自动化解决方案|深圳比斯特