当前位置:首页>Linux>Linux三剑客之awk(上):awk核心原理与基础实战

Linux三剑客之awk(上):awk核心原理与基础实战

  • 2026-10-07 23:32:31
Linux三剑客之awk(上):awk核心原理与基础实战
不知道大家有没有听过,在linux文本处理领域,有号称三剑客的三个命令。他们分别是grep、sed、awk。
三剑客的功能分工如下:

‌grep‌:查找‌文本内容,支持正则表达式匹配,是文本检索主要工具。

‌sed‌:编辑‌文本,可以进行替换、删除、插入等操作,主要对文本进行修改。

‌awk‌:分析、计算、格式化‌文本,主要用于按列处理数据。

很多人对 awk 望而却步,觉得它语法奇怪、逻辑复杂。其实只要抓住核心,awk 非常简单、非常强大、一行顶十行。

这篇文章我从最基础的原理开始,讲透 awk 最核心、最常用的内容。

一、awk 到底是什么?

awk 是一种处理文本数据的脚本语言,是三位外国友人创建。主要特点是:

    它支持变量、条件判断、循环和数组,非常适合处理结构化数据。

    一句话总结:awk = 行处理 + 列提取 + 计算统计 + 格式化输出

    二、awk 基础结构

    awk 的语法格式如下:

    awk [选项] '条件 { 执行动作 }' 文件名  #注意需要单引号、{}
    • 选项:最常用 -F 指定分隔符

    • 条件:哪些行需要处理

    • 动作:处理完要做什么(通常是 print)

    • 文件名:要处理的文件

    awk 的工作流程:

    读入一行,根据分隔符切成字段,判断是否满足条件,满足就执行 { } 里的动作继续读下一行,直到结束。

    三、最核心:字段引用

    awk 最强大的地方,就是按列取数据。

    默认分隔符是空格或 Tab。

    • $0 → 代表整行

    • $1 → 第 1 列

    • $2 → 第 2 列

    • $NF → 最后一列

    • NF → 当前行有多少列

    • NR → 当前行号

    举个最简单的例子:

    awk '{print $1,$2}'  12.txt

    意思就是打印12.txt的每一行的第 1 列和第 2 列。

    四、指定分隔符:-F 参数

    现实中,文件不一定是空格分隔。

    这时必须用 -F 指定分隔符。

    示例 1:查看系统用户名

    awk -F ':' '{print $1}' /etc/passwd#这表示以 : 为分隔符,打印 /etc/passwd 文件中每一行的第一列

    示例 2:读取 222.csv 文件第 1、2列

    awk -F ',' '{print $1,$2}' 222.csv  

    示例 3:按 = 分割配置文件

    awk -F '=' '{print $1}' vsftpd.conf

    五、最常用内置变量

    这些是 awk 最常用的内置变量,记住就能写 80% 的脚本。

    变量 含义

    • $0 整行内容

    • n 第 n 列

    • NF 一行有多少字段

    • $NF 最后一列

    • NR 当前行号

    • FS 输入分隔符(同 -F)

    • OFS 输出分隔符

    • BEGIN 处理前执行

    • END 处理完所有行执行

    实用示例:

    awk '{print NR $1}' 123.txt #打印123.txt的行号及第一列
    awk '{print $NF}' 123.txt #打印123.txt的最后一列

    六、条件筛选:按需处理

    awk 支持非常强大的行过滤。

    1、按数值比较

    awk '$1 > 2 {print $1,$2}' data.txt#表示只打印第一列大于 2 的行的前两列。

    2、按字符匹配

    awk '/error/ {print}' messages  #查找包含error的列awk '!/error/ {print}' messages  #查找不包含error的列

    3、多条件组合

    awk支持多个条件组合,包括以下几种:

    • == != > < >= <= && ||

       awk '$2=="20"&&$3>"11:00:00"{print}' secure

    七、BEGIN 和 END:

    BEGIN:处理前执行一次。相当于签到表,提前设置需要提前的列。

    awk  'BEGIN{print "时间\t\t\tIP地址"} /Accepted password/ {print $1, $2, $3 "\t" $11}' /var/log/secure

    在处理secure中认证成功的IP和时间,相当于先列出列名称。

    END:所有行处理完执行一次

    一般比较适合统计总数、求和、求平均等结果计算。

    awk '{sum += $2} END {print sum}' 12.txt #将12.txt的第二列求和

    八、基础实战

    • 查看系统当前占用 CPU 最高的 10 个进程

    ps -aux |awk '{print $3,$11}'|sort -nr |head -10
    • 查看内存占用最高的10个进程

    • 打印 系统secure日志所有以192.168开头的 IP

    awk '{print $11}' /var/log/secure |grep 192.168
    • 去掉文件空行和注释行

    awk '!/^$/ && !/^#/' vsftpd.confbak  #去掉vsftpd配置备份文件的空号和注释行

    九、总结

    虽然 awk 的语法可能看起来复杂,但掌握其核心概念后,你会发现它非常强大且实用。通过合理使用字段引用、分隔符、条件筛选以及内置变量,你可以轻松实现数据提取、统计和格式化等任务。

    如果你喜欢awk,建议收藏本文,遇到文本分析、数据提取,直接可以直接拿来用!

    最新文章

    随机文章