SHELL脚本学习(十三)初识 gawk 编辑器

概述

gawk提供了一种编程语言,而不仅仅是编辑器命令。

在gawk语言中,可以实现如下操作:

  • 定义变量保存数据
  • 使用算数和字符串运算符处理数据
  • 使用结构化编程概念 为数据处理添加处理逻辑
  • 提取文件中的数据并将其重新排列组合,最后生成格式化报告

一、gawk命令格式

gawk options program file
gawk的可用选项

选项 描述
-F fs 指定字段分隔符
-f file 指定脚本文件
-v var=value 定义gawk脚本中的变量及默认值
-L keyword 执行兼容模式或警告级别

gawk的强大之处在于脚本,你可以编写脚本来读取文件中的数据,然后对其进行处理并显示,形成各种输出报告。

二、从命令行读取gawk脚本

gawk脚本用一对花括号定义,必须将命令放到花括号之间。

由于gawk命令行假定脚本是单个文本字符串,因此还必须将脚本放到单引号中。

shell 复制代码
$ gawk '{print "hello world"}'
sadas
hello world

脚本定义了一个命令 print,它会将输出打印到STDOUT。

因为没有指定文件,所以它一直等待STDIN的输入。无论输入什么,都会打印 hello world。按ctrl+D结束执行。

三、使用数据字段变量

gawk会为每一行的各个字段分配一个变量。默认情况下,gawk会将下列变量分配给文本行中的数据字段。

  • $0 代表整个文本行
  • $1 代表第一个字段
  • $2 代表第二个字段
  • $n 代表第n个字段
shell 复制代码
$ cat <data1
header line
data line 1
End of data line

$ gawk '{print "first="$1 " second="$2}' data1
first=header second=line
first=data second=line
first=End second=of

四、在脚本中使用多条命令

要在命令行指定的脚本中使用多条命令,只需在命令间加分号即可。

shell 复制代码
$ cat <data1
header line
data line 1
End of data line

$ gawk '{$1="replacement";print $0}' data1
replacement line
replacement line 1
replacement of data line

这个脚本先将第一个字段改成 replacement,再显示整行文本。

五、从文件中读取脚本

gawk允许将脚本保存在文件中,然后在命令行中引用脚本。

shell 复制代码
$ cat <gawk_cmd
{print $1="replacement"  " "$0}

$ gawk -f ./gawk_cmd data1
replacement header line
replacement data line 1
replacement End of data line

六、处理数据前执行脚本

gawk会在读取数据前 执行 BEGIN指定的脚本

shell 复制代码
$ cat <gawk_cmd
BEGIN {
    print "Replacement result:"
}

{print $1="replacement"  " "$0}

$ gawk -f ./gawk_cmd data1
Replacement result:
replacement header line
replacement data line 1
replacement End of data line

七、处理输出后执行脚本

END关键字允许指定一个脚本,gawk会在处理完数据之后执行这个脚本。

shell 复制代码
 cat <gawk_cmd
BEGIN {
    print "Replacement result:"
}

{print $1="replacement"  " "$0}

END {
    print "End of file"
}

$ gawk -f ./gawk_cmd data1
Replacement result:
replacement header line
replacement data line 1
replacement End of data line
End of file
相关推荐
aixingkong9212 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝4 小时前
mnt_init 函数
linux
UIU1145 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
律宏阔10 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔10 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴10 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千10 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3710 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3710 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3710 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化