nawk ( 英文名称:New AWK ) 是 Linux / FreeBSD 系统中的 AWK 文本处理语言工具的现代实现,它在 awk 工具的基本功能(对结构化文本进行分析、内容提取和转换)的基础上优化了其功能,它能够更加高效的处理结构化数据列,执行算术运算和字符串操作。

本文将为你介绍 nawk 命令的使用方法,使你对 nawk 命令具有基本的了解,方便你使用该工具处理文本数据。

相关工具对比

特性 awk gawk nawk mawk
实现 基础标准 GNU 增强版本 新版的 AWK 简易的实现
性能 标准 高度优化 较好 最快
默认系统 到预装版本的链接 RHEL 系预装 FreeBSD 预装 Debian 系预装

nawk 命令语法

如下给出 nawk 命令的基本语法结构:

nawk [选项] '模式 { 动作 }' 文件...
nawk [选项] -f 脚本文件 文件...

语法结构中组成部分的解释:

  • 模式:行匹配条件(可以使用正则或表达式等)
  • 动作:模式匹配后执行的命令(用 {} 包裹,还可以另外包含” BEGIN{}:初始处理代码块,END{}:结束处理代码块“)
  • 文件:用来读取内容的文件(文件中字段默认的分隔符为空白字符[空格、Tab])

可以使用的其他符号:

  • FS:字段分隔符(默认空格)
  • OFS:输出字段分隔符
  • NR:当前行号
  • NF:当前行字段数

系统安装指南

nawk 是现代版本的 awk,在没有预装 nawk 的系统中也包含 nawk 软件包。

Debian / Ubuntu 系统

在 Debian / Ubuntu 系统上使用如下命令安装 nawk 命令:

sudo apt update && sudo apt install nawk -y

RHEL / AlmaLinux 系统

在 RHEL / AlmaLinux / Rocky Linux 系统上使用如下命令安装 nawk 命令:

sudo dnf update && sudo dnf install nawk -y

FreeBSD 系统

# 默认已安装为 awk
awk -W version  # 验证版本

nawk 命令使用示例

如下的示例中没有使用特定数据的话,就使用如下的 salary.txt 文本中的工资数据:

张三 技术部 前端工程师 12000
李四 市场部 销售经理 15000
王五 人事部 招聘专员 8000
赵六 技术部 后端工程师 13500

字段对应的统一名称为:姓名、部门、职位、基本工资

1. 基本字段提取

使用 $ 符号后面跟数字 n,引用第 n 个字段;当数字为 0 时,引用的整行的内容:

nawk  '{print $1,$4}' salary.txt

如上的名称输出第一个字段姓名和第四字段工资,输出内容为:

张三 12000
李四 15000
王五 8000
赵六 13500

2. 使用条件过滤数据

使用模式添加条件判断,只输出符合条件的数据:

nawk '$4 > 12000 {print $1}' salary.txt

如上示例会输出工资大于 12000 的人员的姓名:

李四
赵六

3. 自定义字段分隔符

该示例使用如下的数据:

张三,技术部,前端工程师,12000
李四,市场部,销售经理,15000
王五,人事部,招聘专员,8000
赵六,技术部,后端工程师,13500

使用 -F 选项指定字段的分隔符:

nawk -F, '{print $1,$2}' salary.txt

输出内容为:

张三 技术部
李四 市场部
王五 人事部
赵六 技术部

4. 使用模式定义范围

该示例使用如下的数据:

张三 技术部 前端工程师 12000
START
李四 市场部 销售经理 15000
王五 人事部 招聘专员 8000
END
赵六 技术部 后端工程师 13500

使用一个正则表达式匹配开始位置,同时再使用另一个正则表达式匹配末尾位置:

nawk '/START/, /END/ {print NR, $0}' salary.txt

如上示例:NR 为当前的行号,输出内容为:

2 START
3 李四 市场部 销售经理 15000
4 王五 人事部 招聘专员 8000
5 END

5. 使用内置函数

nawk 命令内置了一些函数,可以在动作中使用:

nawk '{print length($2)}' salary.txt

如上示例使用 length() 函数统计字节的长度,字节的长度而不是字符的长度,字节的长度与使用的编码有关,输出内容为:

9
9
9
9

示例文件使用的是 UTF-8,每个汉字占三个字节。

6. 大文件性能

在处理大文件时,使用管道减少内容的使用:

nawk 'NF > 5 {print $1, $6}' file1.txt > file2.txt

命令选项详解

如下给出 nawk 命令选项的详细解释说明:

选项 说明 技术细节
-f file 从文件读取脚本内容 支持多文件包含
-F fs 指定字段的分隔符 支持正则表达式
-v var=val 定义外部变量,在动作内使用 可以在 BEGIN 前初始化
-n 预设变量 等效 -v
-W compat 兼容模式 模拟传统 awk
-W posix 严格使用 POSIX 模式 禁用扩展
-W version 显示版本信息 包含功能支持
-W exec file 执行脚本文件 安全模式

结语

本文全面的介绍了 nawk 的语法结构及其功能,并给出了 nawk 命令的具体使用示例,相信你能够对 nawk 命令有个基本的了解,并帮助你正确的使用 nawk 处理文本数据。 nawk 命令可以在 Linux 各发行版和 FreeBSD 系统中使用,基本功能是相同的。