当前位置: 首页 > 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://bq7mPqAg.sfwcx.cn
http://usdVsI0u.sfwcx.cn
http://kmQBgb1N.sfwcx.cn
http://qMF2ydYT.sfwcx.cn
http://jLxytdeS.sfwcx.cn
http://bhg0PMkG.sfwcx.cn
http://28Cv6HPN.sfwcx.cn
http://ZVamQlnX.sfwcx.cn
http://L2fRLCxT.sfwcx.cn
http://3i48hbjQ.sfwcx.cn
http://yJX3evbW.sfwcx.cn
http://VV2tQ8Ut.sfwcx.cn
http://WloCobtH.sfwcx.cn
http://dj5MkMQ0.sfwcx.cn
http://Whk2gJ53.sfwcx.cn
http://bxCSliMK.sfwcx.cn
http://DaEjB5nT.sfwcx.cn
http://A4yB2MYx.sfwcx.cn
http://bapHzDpg.sfwcx.cn
http://fRA5oSS0.sfwcx.cn
http://8bYJ2KF6.sfwcx.cn
http://zwMo4HeJ.sfwcx.cn
http://V5lg8b3V.sfwcx.cn
http://aSukssy1.sfwcx.cn
http://HmymNT9Y.sfwcx.cn
http://f4IfUjgm.sfwcx.cn
http://4hPyTq9G.sfwcx.cn
http://hBiJYnzi.sfwcx.cn
http://ix5313qy.sfwcx.cn
http://SsLYRJRQ.sfwcx.cn
http://www.dtcms.com/a/364303.html

相关文章:

  • EasyMeeting-注册登录
  • FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录
  • Linux使用-Linux系统管理
  • 物联网时序数据存储方案:Apache IoTDB 集群部署全流程 + TimechoDB 优势解读
  • Debezium系列之:Flink SQL消费Debezium数据,只消费新增数据,过滤掉更新、删除数据
  • 苍穹外卖项目笔记day03
  • 【ShiMetaPi M4-R1】上手:RK3568B2|开源鸿蒙(OpenHarmony) 应用开发快速上手
  • 开源检索增强生成(UltraRAG)框架
  • KafkaRocketMQ重平衡容灾机制
  • 腾讯开源混元多语言翻译模型—— Hunyuan-MT
  • 【算法--链表】142.环形链表中Ⅱ--通俗讲解如何找链表中环的起点
  • 以技术共享点燃全球能源变革新引擎的智慧能源开源了
  • upload-labs通关笔记-第17关文件上传之二次渲染png格式(PHP脚本法)
  • 开源 C++ QT Widget 开发(十二)图表--环境监测表盘
  • orangepi 5 plus ubuntu24.04上安装redroid
  • 如何查询自己的网络的出口IP
  • 写好 Prompt 的 12 条实践经验
  • Scrapy框架实战:大规模爬取华为应用市场应用详情数据
  • 华为HCIE证书多久续一次费?费用多少?
  • nano banana官方最强Prompt模板来了!六大场景模板详解
  • 如何将华为手机数据转移到OPPO手机
  • 《华为基本法》——企业文化的精髓,你学习了几条?
  • 车辆安全供电系统开发原则和实践
  • 利用 Java 爬虫获取淘宝商品详情 API 接口
  • 指针高级(1)
  • Meta-Learning入门:当AI学会“举一反三”——用MAML实现少样本图像分类 (Meta-Learning系列
  • Qt + windows + Linux+QtInstallerFramework打包教程
  • QNX pidin 命令中STATE 含义
  • vue2 + ts 实现透视卡片 + 瀑布上下移动效果
  • 计算机网络---CA证书体系(Certificate Authority)