shell编程——AWK 从入门到精通

ops/2024/12/19 8:23:35/

1. 前言

在日常运维、数据分析和开发工作中,处理文本数据是不可避免的任务。无论是从日志中提取关键信息,还是批量处理数据表,效率和灵活性都至关重要。AWK 是 UNIX/Linux 环境中一款轻量级却功能强大的文本处理工具,它以简洁的语法、强大的模式匹配功能和灵活的操作能力闻名,广泛用于日志分析、数据处理、自动化脚本等领域。

本篇文章将带你从零开始掌握 AWK,涵盖基础用法、进阶操作、高级技巧及常见应用场景,帮助你成为一名文本处理专家。


2. AWK 基本概念

什么是 AWK?

AWK 是一种专门用于处理文本的脚本语言,得名于三位开发者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它设计的初衷是简化对结构化文本的处理任务。

  • 核心理念:逐行读取文件,按指定的模式匹配进行操作,最终输出处理结果。
  • 优势
    • 简洁的语法适合快速开发;
    • 支持复杂的逻辑和计算;
    • 与其他命令工具(如 grepsedsort)无缝结合。

基本语法结构

AWK 程序的基本结构如下:

awk '模式 {动作}' 文件
  • 模式:用于匹配输入的行。例如匹配特定字符串或满足某些条件的行。
  • 动作:对匹配到的行执行指定的操作,如打印、计算或替换。

示例:

ps | awk '{print $1}'
  • 上述命令中,{print $1} 是动作,表示输出每行的第一个字段。

字段分隔符

AWK 默认将空格或制表符作为字段分隔符,但可以通过 -F 选项自定义分隔符。例如:

awk -F ":" '{print $1}' /etc/passwd
  • 这里的 -F ":": 设置为字段分隔符,输出 /etc/passwd 文件中每行的第一个字段(即用户名)。

内置工作流

AWK 程序有三个主要的处理阶段:

  1. BEGIN:在读取任何输入文件之前执行,用于初始化。
  2. 主程序块:逐行处理输入文件中的内容。
  3. END:在处理完所有行后执行,用于汇总计算或输出最终结果。

例如:

awk 'BEGIN {print "开始处理..."} {print $1} END {print "处理结束"}' 文件

3. 基础用法

3.1 提取文本信息

提取文本中的某些字段或行是 AWK 最常见的操作之一:

  • 获取系统中所有运行的进程 ID:
    ps | awk '{print $1}'
    
  • /etc/passwd 中提取用户名:
    awk -F ":" '{print $1}' /etc/passwd
    

3.2 条件筛选

  • 提取行长度大于 7 的文本:
    awk 'length($0) > 7' /etc/shells
    
  • 筛选 /etc/shells 中内容等于 /bin/bash 的行:
    awk '{if ($0=="/bin/bash") print $0}' /etc/shells
    

3.3 脚本特性

AWK 支持控制流和简单计算,例如输出 1 到 10 的平方:

awk 'BEGIN{for(i=1;i<=10;i++) print "数字",i,"的平方为",i*i}'

4. 进阶使用

4.1 管道操作

AWK 通常与其他命令结合,处理复杂任务。例如:

  • 启动 Docker 中的所有容器:
    docker ps -a | awk '{print $1}' | tail -n +2 | xargs docker start
    
  • 停止 Docker 中的所有容器:
    docker ps -a | awk '{print $1}' | tail -n +2 | xargs docker stop
    

4.2 字符匹配

  • 筛选字段末尾不包含 test 的 Docker 容器:
    docker ps | awk '!match($NF,/^test/) {print NR,$NF}'
    
  • 上述命令通过正则表达式匹配字段,并排除特定条件。

4.3 字段统计

打印 /etc/shells 的最后一个字段并排序去重:

awk -F "/" '/^\// {print $NF}' /etc/shells | sort -u
  • /^\// 是一个正则表达式,用于匹配以斜杠 / 开头的行

5. 高级技巧

5.1 嵌套条件

通过复杂逻辑筛选数据,例如从日志中筛选错误条目:

awk '{if ($3=="ERROR" && $5>10) print $0}' server.log

5.2 自定义函数

AWK 支持定义函数,以实现复杂计算:

awk 'function fib(n) {if (n<=2) return 1; else return fib(n-1)+fib(n-2)} BEGIN {for(i=1;i<=10;i++) print fib(i)}'

5.3 多文件处理

合并两个文件并根据字段匹配:

awk 'NR==FNR{a[$1]=$2; next} $1 in a {print $1, $2, a[$1]}' file1 file2
  • file1file2 的第一个字段匹配,输出关联字段。

6. 性能优化

  • 减少重复计算
    awk '{sum+=$2} END {print "总和:", sum}' data.txt
    
  • 逐行处理大文件
    使用 getline 避免一次性加载大文件,节省内存:
    awk '{while (getline < "file.txt") print $0}'
    

7. 常用内建变量

变量描述
$0当前整行内容
$1,$2...当前行的第 N 个字段
NF当前行的字段数
NR当前行号(全局累计)
FNR当前行号(当前文件)
FS输入字段分隔符
OFS输出字段分隔符

8. 常见应用场景

  1. 日志分析:提取错误日志、统计关键字出现次数。
  2. 数据处理:筛选表格字段、生成统计报告。
  3. 自动化脚本:快速处理系统配置文件。

9. 总结

AWK 是 UNIX/Linux 环境中的利器,适用于各种文本处理需求。通过不断实践和优化,您将发现 AWK 的强大之处,从而极大提升工作效率。


http://www.ppmy.cn/ops/143135.html

相关文章

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…

Vue.js前端框架教程4:Vue响应式变量和指令(Directives)

文章目录 Vue 2.x 中的响应式变量Vue 3.x 中的响应式变量 指令&#xff08;Directives&#xff09;v-modelv-onclick 其他常用指令 在 Vue 中&#xff0c;响应式变量是与 Vue 实例的数据绑定系统紧密相关的。它们允许你创建数据和 DOM 之间的双向绑定&#xff0c;这意味着当响应…

elementui进度条Progress组件

一、Progress组件 二、各部分代码 1.html代码 <div><div class"showprogress" v-for"item in regions" :key"item.name"><span>{{ item.name }}</span><el-progress :percentage"percentage(item.count, total…

软件工程复习重点(第一章 软件工程概述)

1.什么是软件&#xff1f;软件有什么特点&#xff1f; 软件分类&#xff1f; 计算机软件--计算机系统中的程序、数据及其文档的统称。 2.软件发展的3个阶段 &#xff08;1&#xff09;程序设计阶段&#xff1b;&#xff08;2&#xff09;程序系统阶段&#xff1b;&#xff08…

简单的go写的websocket协议 im 聊天 服务,流程简单清晰,采用golang编写,flutter im客户端。免费开源哈,随意用

mini-im 1、说明&#xff1a; 项目地址&#xff1a;https://github.com/haomiao33/minim 1.1、项目介绍&#xff1a; 简单的go写的im服务&#xff0c;流程简单清晰,大部分接口使用的是http&#xff0c;方便流程控制。login服务目前只是用来做服务端推送消息通知到客户端。本…

[C++]多态

1. 什么是多态性&#xff1f; 1.定义 多态性是指同一个函数或操作在不同对象上表现出不同的行为。 2.分类 C 中的多态性主要分为两种&#xff1a; 1.编译时多态性&#xff08;静态多态性&#xff09;&#xff1a; 编译时决定调用哪个函数。通过 函数重载 和 运算符重载 实…

Linux下常用的网络编程函数详解

在网络编程中&#xff0c;我们经常需要处理 IP 地址和端口号等数据&#xff0c;这些数据需要在主机字节序&#xff08;Host Byte Order&#xff09;与网络字节序&#xff08;Network Byte Order&#xff09;之间进行转换。 什么是字节序&#xff1f; 字节序指的是多字节数据在…

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…