linux初探:文字处理工具awk (1)

简介: linux初探:文字处理工具awk (1)

之前更新了linux初探Json处理工具之jq,发现挺有意思的,索性将awkgrepsed等都给总结一下。



什么是awk


这里的awk,在linux系统下,我们一般指的是gawk,是GUN利用awk来创建的一门编程语言,符合POSIX 1003.1标准,主要是用于文字处理,为此我们简称awk,在linux系统中,一般替我们做了软连接,我们可以通过whereis一路找下去,即可找到gawk或者其他版本的awk


并不是所有的linux系统都是预装了gawk


image.png

我们为什么需要awk


对于有取相应列需求的,我们使用awk在合适不过了,这也是使用awk最多的操作之一,这里,我们举了一个不是例子的例子,因为要证明一个东西确实被“需要”,是很困难的,没有什么是不可替代的。


需求分析

我们准备一个文本信息,我们想取出其中黄色部分勾选出来的内容

image.png


shell脚本


我们先使用shell脚本来写这个需求,具体流程为

  • 先读取一行
  • 以空格为分割,获取行数有多少列
  • 输出最后一列

根据需求分析,我们很快便顺利编写了脚本

image.png


我们执行脚本查看结果

image.png

awk命令

我们将上述操作,使用awk来写,仅需一句 awk '{print $NF}'即可,具体逻辑,我们在案例中讲解。

image.png

希望通过这个例子,能够了解,我们为什么要学习使用awk,不仅是因为可以在同事面前装一波,更重要的是能够节省大量的时间。



awk工作流程

当我们想获取某个文件,假设以空格分开,获取第多少列,这个时候,就非awk莫属了,它的工作流程简单梳理,可以理解为如下模式。

image.png



其实我们将awk分为3个块,分别是 BEGIN语句块、END语句块 和 主体语句块 , 其具体工作流程如下

  • 执行BEGIN语句块
  • 重复从文件/标准输入中读取一行,执行pattern语句块,直至文件结尾/标准输入结束
  • 最后执行END语句块

其语法如下

BEGIN {
        # BEGIN 语句块
}
{
        # 主体语句块
        print $0
}
END {
        # END 语句块
}



其中,BEGINEND语句块可以被忽略。



从最简单开始


awk内置变量

$num: 每行获取的num列,若为0,则代表整行

FS: 自定义分隔符,在命令行,可以使用-F来指定

NF: 列数量

NR: 行数



提取文档的第一列

例如上面的文案,我们想提取文档的第一列出来

image.png


awk中,我们使用$来取具体的列,比如 第一列: $1,第二列$2,以此类推。

要输出第一列,我们使用print即可。

很轻松,我们可以顺利用命令写出求出第一列

命令: awk '{print $1}'

image.png

这个命令就是我们忽略了BEGIN以及END,我们补充完整是这样的。

image.png


我们使用awk -f来从文件读取awk指定且运行指令。

image.png


指定分隔符

awk中,默认是以空格作为分隔符,但是我们可以指定自定义分隔符,例如我们想获取/etc/passwd中的用户名,但是该文件是以:作为分割的,文件内容如下:

image.png

在进行awk切割中,我们使用FS作为指定自定义分隔符,该操作需要定义在BEGIN语句块中,我们编写下awk指令

image.png


我们使用命令行,则可以使用-F来指定分隔符,例如:

image.png

这里提及一点,若有多个分隔符,可以使用-F=[]来定义,若我们即想设置:为分隔符,又想设置空格为分隔符,即可设置为-F=[. ]



读取文档最后一列

我们可以使用NF变量,读取文档最后一列,我们同样拿/etc/passwd为例,我们想获取用户的默认shell

即以:分割的最后一列

image.png


我们可以使用命令awk -F ":" '{print $NF}'来获取

image.png

$NF的具体逻辑是什么呢?


NFawk的内置变量,其记录了该行按照预设的分隔符进行划分,其记录的具体列数,将值放入NF中,而使用$num获取第num列的数据,而该num我们代入NF则是最后一列。

我们通过例子说明

image.png


通过案例,我们可以验证,NF仅仅是记录了该行按照预设定义的分隔符进行分割后的列数。



给文件前增加一个行号


NR是记录awk处理的行数,我们可以使用该内置变量来打印行数,例如:

我们还是使用pdudo_awk_test.txt为案例,打印一下行数

命令: awk '{print NR": "$0}'

image.png



NR内置变量作用不止于此,例如,我们可以处理第100行到120行,就可以使用NR进行控制。



总结


在文章中,我们了解了什么是awk,以及谈论了一下我们为什么需要awk,总之,在列文本处理这块awk非常棒,而后在一些案例中,我们也看到了比较简单的awk操作,awk不仅是命令行,也是一门编程语言,所以也有其条件判断if、以及循环for等,我们后期再介绍。




相关文章
|
6月前
|
安全 Linux Shell
四、Linux核心工具:Vim, 文件链接与SSH
要想在Linux世界里游刃有余,光会“走路”还不够,还得配上几样“高级装备”。首先是Vim编辑器,它像一把瑞士军刀,让你能在命令行里高效地修改文件。然后要懂“软硬链接”,软链接像个快捷方式,硬链接则是给文件起了个别名。最后,SSH是你的“传送门”,不仅能让你安全地远程登录服务器,还能用scp轻松传输文件,设置好密钥更能实现免-密登录,极大提升效率。
495 5
|
10月前
|
Linux 开发工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
|
6月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
548 16
|
6月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
307 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
8月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
230 0
Linux系统性能调优技巧和相关工具
|
8月前
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
907 16
|
7月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
10月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
472 32
|
11月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。