awk 系列:如何使用 awk 内置变量

简介:

我们将逐渐揭开 awk 功能的神秘面纱,在本节中,我们将介绍 awk 内置built-in变量的概念。你可以在 awk 中使用两种类型的变量,它们是:用户自定义user-defined变量(我们在第八节中已经介绍了)和内置变量。

awk 内置变量示例

awk 内置变量已经有预先定义的值了,但我们也可以谨慎地修改这些值,awk 内置变量包括:

  • FILENAME : 当前输入文件名称
  • NR : 当前输入行编号(是指输入行 1,2,3……等)
  • NF : 当前输入行的字段编号
  • OFS : 输出字段分隔符
  • FS : 输入字段分隔符
  • ORS : 输出记录分隔符
  • RS : 输入记录分隔符

让我们继续演示一些使用上述 awk 内置变量的方法:

想要读取当前输入文件的名称,你可以使用 FILENAME 内置变量,如下:


 
 
  1. $ awk ' { print FILENAME } ' ~/domains.txt

awk FILENAME 变量

awk FILENAME 变量

你会看到,每一行都会对应输出一次文件名,那是你使用 FILENAME 内置变量时 awk 默认的行为。

我们可以使用 NR 来统计一个输入文件的行数(记录),谨记,它也会计算空行,正如我们将要在下面的例子中看到的那样。

当我们使用 cat 命令查看文件 domains.txt 时,会发现它有 14 行文本和 2 个空行:


 
 
  1. $ cat ~/domains.txt

输出文件内容

输出文件内容


 
 
  1. $ awk ' END { print "Number of records in file is: ", NR } ' ~/domains.txt

awk 统计行数

awk 统计行数

想要统计一条记录或一行中的字段数,我们可以像下面那样使用 NR 内置变量:


 
 
  1. $ cat ~/names.txt

列出文件内容

列出文件内容


 
 
  1. $ awk '{ "Record:",NR,"has",NF,"fields" ; }' ~/names.txt

awk 统计文件中的字段数

awk 统计文件中的字段数

接下来,你也可以使用 FS 内置变量指定一个输入文件分隔符,它会定义 awk 如何将输入行划分成字段。

FS 默认值为“空格”和“制表符”,但我们也能将 FS 值修改为任何字符来让 awk 根据情况切分输入行。

有两种方法可以达到目的:

  • 第一种方法是使用 FS 内置变量
  • 第二种方法是使用 awk 的 -F 选项

来看 Linux 系统上的 /etc/passwd 文件,该文件中的各字段是使用 : 分隔的,因此,当我们想要过滤出某些字段时,可以将 : 指定为新的输入字段分隔符,示例如下:

我们可以使用 -F 选项,如下:


 
 
  1. $ awk -F':' '{ print $1, $4 ;}' /etc/passwd

awk 过滤密码文件中的各字段

awk 过滤密码文件中的各字段

此外,我们也可以利用 FS 内置变量,如下:


 
 
  1. $ awk ' BEGIN { FS=“:” ; } { print $1, $4 ; } ' /etc/passwd

使用 awk 过滤文件中的各字段

使用 awk 过滤文件中的各字段

使用 OFS 内置变量来指定一个用于输出的字段分隔符,它会定义如何使用指定的字符分隔输出字段,示例如下:


 
 
  1. $ awk -F':' ' BEGIN { OFS="==>" ;} { print $1, $4 ;}' /etc/passwd

向文件中的字段添加分隔符

向文件中的字段添加分隔符

在本节中,我们已经学习了使用含有预定义值的 awk 内置变量的理念。但我们也能够修改这些值,虽然并不推荐这样做,除非你明白自己在做什么,并且充分理解(这些变量值)。

原文发布时间为:2016-08-08

本文来自云栖社区合作伙伴“Linux中国”

相关文章
|
关系型数据库 MySQL Go
MySQL数据库安装(超详细完整步骤)
MySQL数据库安装(超详细完整步骤)
1946 1
|
传感器 算法 API
ESP-IDF Modbus 主站示例程序
ESP-IDF Modbus 主站示例程序
367 0
|
NoSQL 关系型数据库 MySQL
Dockerfile(9) - ENTRYPOINT 指令详解
Dockerfile(9) - ENTRYPOINT 指令详解
978 0
|
NoSQL 关系型数据库 MySQL
MongoDB 慢查询语句优化分析策略
MongoDB查询语句太慢了,开启 Profiling 功能进行分析后发现,问题其实很好解决,涨知识了
620 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:跨平台模型移植与部署
【7月更文挑战第10天】 使用Python实现深度学习模型:跨平台模型移植与部署
821 1
|
Linux 开发工具 Python
【Deepin 20系统】Linux系统从零打造完美VScode for Python环境
如何在Deepin 20系统中从零开始配置一个完美的VScode for Python开发环境,包括安装Anaconda、VScode、必要的插件、汉化、主题和字体设置,以及如何运行和调试Python程序。
455 6
|
前端开发 JavaScript
CSS 【详解】响应式布局(含 rem 详解)
CSS 【详解】响应式布局(含 rem 详解)
214 0
|
人工智能 安全 搜索推荐
AIGC重塑金融生态
【1月更文挑战第20天】AIGC重塑金融生态
385 7
AIGC重塑金融生态
|
SQL 分布式计算 DataWorks
在DataWorks中,将MaxCompute的表映射成Hologres(Holo)外部表的语句
【2月更文挑战第32天】在DataWorks中,将MaxCompute的表映射成Hologres(Holo)外部表的语句
301 1
TortoiseSVN安装使用教程(超详细)
TortoiseSVN安装使用教程(超详细)
1802 0
TortoiseSVN安装使用教程(超详细)