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等,我们后期再介绍。




相关文章
|
29天前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
74 8
|
2月前
|
监控 Unix Linux
Linux系统工具
Linux系统工具
52 6
|
2月前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
64 5
Linux系统之安装Ward服务器监控工具
|
2月前
|
JSON JavaScript Linux
Linux系统之安装cook菜谱工具
【10月更文挑战第15天】Linux系统之安装cook菜谱工具
41 2
Linux系统之安装cook菜谱工具
|
1月前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
126 1
|
1月前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
45 1
|
2月前
|
Linux Perl
Linux awk命令使用技巧
【10月更文挑战第16天】Linux awk命令使用技巧
39 4
|
2月前
|
存储 安全 Linux
Linux文件管理命令md5sum awk
通过结合 `md5sum`和 `awk`,不仅可以高效地进行文件完整性校验,还能灵活地处理和分析校验结果,为系统管理、数据审计等工作提供强大的支持。
78 2
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
732 2
|
3月前
|
监控 安全 Linux
如何利用Kali Linux进行网站渗透测试:最常用工具详解
如何利用Kali Linux进行网站渗透测试:最常用工具详解
141 6