linux awk命令和awk语言

linux awk和awk语言

通常大家说的awk几乎都是在linux/unix中使用的awk命令,见下,

https://www.geeksforgeeks.org/awk-command-unixlinux-examples/

作为命令使用的话,存在下内容

Awk 是一个工具,使程序员能够编写小巧但有效的程序,这些程序以定义要在文档的每一行中搜索的文本模式的形式出现,并定义当在某一行中找到匹配项时应采取的操作。Awk 主要用于模式扫描和处理。它会搜索一个或多个文件,查看它们是否包含与指定模式匹配的行,然后执行相关操作。

Awk 是从开发人员的名字缩写而来的------Aho、Weinberger 和 Kernighan

AWK 可以用来做什么?

  1. AWK 操作:

    (a) 逐行扫描文件

    (b) 将每行输入拆分为字段

    © 将输入行/字段与模式进行比较

    (d) 对匹配的行执行操作

  2. 适用范围:

    (a) 转换数据文件

    (b) 生成格式化的报告

  3. 编程结构:

    (a) 格式化输出行

    (b) 算术和字符串操作

    © 条件语句和循环

语法:

awk options 'selection _criteria {action }' input-file > output-file

选项:

-f program-file : Reads the AWK program source from the file

program-file, instead of from the

first command line argument.

-F fs : Use fs for the input field separator

示例:

考虑以下文本文件作为以下所有情况的输入文件:

$cat > employee.txt

ajay manager account 45000

sunil clerk account 25000

varun manager sales 50000

amit manager account 47000

tarun peon sales 15000

deepak clerk sales 23000

sunil peon sales 13000

satvik director purchase 80000

  1. Awk 的默认行为:默认情况下,Awk 会打印指定文件中的每一行数据。

$ awk '{print}' employee.txt

ajay manager account 45000

sunil clerk account 25000

varun manager sales 50000

amit manager account 47000

tarun peon sales 15000

deepak clerk sales 23000

sunil peon sales 13000

satvik director purchase 80000

在上述示例中,没有给出模式。因此,操作适用于所有行。print 动作没有参数,默认会打印整行,所以会成功打印文件中的所有行。

  1. 打印匹配给定模式的行。

$ awk '/manager/ {print}' employee.txt

AWK 命令在 Unix/Linux 中的例子 - GeeksforGeeks

ajay manager account 45000

varun manager sales 50000

amit manager account 47000

在上面的例子中,awk 命令打印出所有匹配 'manager' 的行。

  1. 将一行分为字段:对于每条记录即每一行,awk 命令默认使用空白字符分隔记录,并将其存储在 $n 变量中。如果一行有 4 个单词,它将分别存储在 $1、$2、$3 和 $4 中。此外,$0 代表整个行

$ awk '{print $1,$4}' employee.txt

$ awk '{print $1,$4}' employee.txt

AWK 命令在 Unix/Linux 中的例子 - GeeksforGeeks

ajay 45000

sunil 25000

varun 50000

amit 47000

tarun 15000

deepak 23000

sunil 13000

satvik 80000

在上面的例子中,$1 和 $4 分别代表 Name 和 Salary 字段。

Awk 中的内置变量

Awk 的内置变量包括字段变量---$1、$2、$3 等($0 是整个行)---这些变量将一行文本分解为单独的单词或称为字段的片段。

NR: NR 命令会保持当前输入记录的计数。请注意,记录通常是一行。Awk 命令会对文件中的每一记录执行一次模式/动作语句。

NF: NF 命令会统计当前输入记录中的字段数量。

FS: FS 命令包含字段分隔字符,用于划分输入行上的字段。默认值是"空白字符",即空格和制表符。FS 可以在 BEGIN 中重新分配为另一个字符以更改字段分隔符。

RS: RS 命令存储当前的记录分隔符字符。由于默认情况下,输入行是输入记录,因此默认的记录分隔符字符是换行符。

OFS: OFS 命令存储输出字段分隔符,当 Awk 打印字段时,它会用 OFS 分隔字段。默认情况下,OFS 是一个空格。每当 print 有多个用逗号分隔的参数时,它会在每个参数之间打印 OFS 的值。

ORS: ORS 命令存储输出记录分隔符,当 Awk 打印时,该分隔符会将输出行分隔开。默认情况下,它是换行符。print 会自动在要打印的内容末尾输出 ORS 的内容。

示例:

使用 NR 内置变量(显示行号)

$ awk '{print NR,$0}' employee.txt

1 ajay manager account 45000

2 sunil clerk account 25000

3 varun manager sales 50000

4 amit manager account 47000

5 tarun peon sales 15000

6 deepak clerk sales 23000

7 sunil peon sales 13000

8 satvik director purchase 80000

在上述示例中,使用 NR 的 awk 命令打印了所有行以及行号。

使用内置变量 NF(显示最后一个字段)

$ awk '{print 1,NF}' employee.txt

ajay 45000

sunil 25000

varun 50000

amit 47000

tarun 15000

deepak 23000

sunil 13000

satvik 80000

在上面的例子中,1 表示 Name,NF 表示 Salary。我们可以使用 $NF 获取 Salary,其中 $NF 表示最后一个字段。

另一个内置变量 NR 的用法(显示第 3 到第 6 行)

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt

3 varun manager sales 50000

4 amit manager account 47000

5 tarun peon sales 15000

6 deepak clerk sales 23000

更多的案例

  1. 要打印每行的第一个项以及该行号(NR),两者之间用 " -- " 分隔,在 geeksforgeeks.txt 中执行以下命令:

$ awk '{print NR "- " $1 }' geeksforgeeks.txt

  1. 要从 geeksforgeeks.txt 中返回第二列/项:

$ awk '{print $2}' geeksforgeeks.txt

  1. 如果存在非空行则打印该行

awk 'NF == 0 {print NR}' geeksforgeeks.txt

OR

awk 'NF <= 0 {print NR}' geeksforgeeks.txt

  1. 查找文件中最长行的长度:

$ awk '{ if (length($0) > max) max = length($0) } END { print max }' geeksforgeeks.txt

  1. 计算文件中的行数:

$ awk 'END { print NR }' geeksforgeeks.txt

  1. 打印包含超过 10 个字符的行:

$ awk 'length($0) > 10' geeksforgeeks.txt

  1. 在任何特定列中查找/检查任何字符串:

$ awk '{ if($3 == "B6") print $0;}' geeksforgeeks.txt

  1. 要打印从 1 到 n(例如 6)的数的平方:

$ awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }'


awk语言

官方材料:

https://www.gnu.org/software/gawk/manual/gawk.html#Qualified-Names

第一部分:

awk 语言

1 awk 入门

1.1 如何运行 awk 程序

1.1.1 一次性一次性 awk 程序

1.1.2 在没有输入文件的情况下运行 awk

1.1.3 运行长程序

1.1.4 可执行的 awk 程序

1.1.5 awk 程序中的注释

1.1.6 Shell 引用问题

1.1.6.1 在 MS-Windows 批处理文件中引用

1.2 示例的数据文件

1.3 一些简单的例子

1.4 具有两条规则的示例

1.5 更复杂的例子

1.6 awk 语句 vs Lines

1.7 awk 的其他特点

1.8 何时使用 awk

1.9 总结

2 喋喋不休

2.1 调用 awk

2.2 命令行选项

2.3 其他命令行参数

2.4 命名标准输入

2.5 gawk 使用的环境变量

2.5.1 AWKPATH 环境变量

2.5.2 AWKLIBPATH 环境变量

2.5.3 其他环境变量

2.6 gawk 的退出状态

2.7 将其他文件包含在程序中

2.8 将 Dynamic Extensions 加载到程序中

2.9 过时的选项和/或功能

2.10 未记录的选项和功能

2.11 总结

3 正则表达式

3.1 如何使用正则表达式

3.2 转义序列

3.3 正则表达式运算符

3.3.1 awk 中的 Regexp 运算符

3.3.2 关于区间表达式的一些说明

3.4 使用 Bracket 表达式

3.5 有多少文本匹配?

3.6 使用动态正则表达式

3.7 特定于 gawk 的正则表达式运算符

3.8 匹配时区分大小写

3.9 总结

4 读取输入文件

4.1 如何将 Input 拆分为 Records

4.1.1 使用标准 awk 进行记录分割

4.1.2 使用 gawk 进行记录分割

4.2 检查字段

4.3 非常量字段编号

4.4 更改字段的内容

4.5 指定字段的分隔方式

4.5.1 空格通常分隔字段

4.5.2 使用正则表达式分隔字段

4.5.3 将每个角色设为单独的字段

4.5.4 使用逗号分隔值文件

4.5.5 从命令行设置 FS

4.5.6 将整行设置为单个字段

4.5.7 字段拆分摘要

4.6 读取固定宽度数据

4.6.1 处理固定宽度数据

4.6.2 跳过中间字段

4.6.3 捕获可选的尾随数据

4.6.4 具有固定宽度数据的字段值

4.7 按内容定义字段

4.7.1 有关 CSV 文件的更多信息

4.7.2 FS 与 FPAT:细微差别

4.8 检查 gawk 如何拆分记录

4.9 多行记录

4.10 使用 getline 进行显式输入

4.10.1 使用不带参数的 getline

4.10.2 在变量中使用 getline

4.10.3 从文件中使用 getline

4.10.4 在文件中的 Variable 中使用 getline

4.10.5 使用 Pipe 中的 getline

4.10.6 从 Pipe 将 getline 用于变量

4.10.7 从 Coprocess 使用 getline

4.10.8 在 Coprocess 的 Variable 中使用 getline

4.10.9 关于 getline 需要记住的要点

4.10.10 getline 变体总结

4.11 读取带有超时的输入

4.12 在某些 Importing 错误后重试读取

4.13 命令行上的目录

4.14 总结

4.15 练习

5 打印输出

5.1 print 语句

5.2 print 语句示例

5.3 输出分隔符

5.4 使用 print 控制数字输出

5.5 使用 printf 语句进行更高级的打印

5.5.1 printf 语句简介

5.5.2 格式控制字母

5.5.3 printf 格式的修饰符

5.5.4 使用 printf 的示例

5.6 重定向 print 和 printf 的输出

5.7 标准预打开数据流的特殊文件

5.8 gawk 中的特殊文件名

5.8.1 使用 gawk 访问其他打开的文件

5.8.2 用于网络通信的特殊文件

5.8.3 特殊文件名注意事项

5.9 关闭输入和输出重定向

5.9.1 使用 close() 的返回值

5.10 加快管道输出

5.11 启用 Nonfatal 输出

5.12 总结

5.13 练习

6 表达式

6.1 常量、变量和转换

6.1.1 常量表达式

6.1.1.1 数值和字符串常量

6.1.1.2 八进制数和十六进制数

6.1.1.3 正则表达式常量

6.1.2 使用正则表达式常量

6.1.2.1 标准正则表达式常量

6.1.2.2 强类型 Regexp 常量

6.1.3 变量

6.1.3.1 在程序中使用变量

6.1.3.2 在命令行中指定变量

6.1.4 字符串和数字的转换

6.1.4.1 awk 如何在字符串和数字之间进行转换

6.1.4.2 区域设置可以影响转换

6.2 运算符:对值执行某些作

6.2.1 算术运算符

6.2.2 字符串拼接

6.2.3 赋值表达式

6.2.4 递增和递减运算符

6.3 真值和条件

6.3.1 awk 中的 True 和 False

6.3.2 变量类型和比较表达式

6.3.2.1 字符串类型与数字类型

6.3.2.2 比较运算符

6.3.2.3 基于语言环境整理顺序的字符串比较

6.3.3 布尔表达式

6.3.4 条件表达式

6.4 函数调用

6.5 运算符优先级(运算符如何嵌套)

6.6 您所在的位置会有所不同

6.7 总结

7 模式、作和变量

7.1 Pattern 元素

7.1.1 作为模式的正则表达式

7.1.2 表达式作为模式

7.1.3 使用模式指定记录范围

7.1.4 BEGIN 和 END 特殊模式

7.1.4.1 启动和清理作

7.1.4.2 BEGIN 和 END 规则的输入/输出

7.1.5 BEGINFILE 和 ENDFILE 特殊模式

7.1.6 空模式

7.2 在程序中使用 Shell 变量

7.3作

7.4 Actions 中的控制语句

7.4.1 if-else 语句

7.4.2 while 语句

7.4.3 do-while 语句

7.4.4 for 语句

7.4.5 switch 语句

7.4.6 break 语句

7.4.7 continue 语句

7.4.8 next 语句

7.4.9 nextfile 语句

7.4.10 exit 语句

7.5 预定义变量

7.5.1 控制 awk 的内置变量

7.5.2 传达信息的内置变量

7.5.3 使用 ARGC 和 ARGV

7.6 总结

awk 中的 8 个数组

8.1 数组的基础

8.1.1 数组简介

8.1.2 引用数组元素

8.1.3 分配数组元素

8.1.4 基本数组示例

8.1.5 扫描数组的所有元素

8.1.6 将预定义的数组扫描顺序与 gawk 结合使用

8.2 使用数字为数组下标

8.3 将未初始化的变量用作下标

8.4 delete 语句

8.5 多维数组

8.5.1 扫描多维数组

8.6 数组中的数组

8.7 总结

9 主要工作内容

9.1 内置函数

9.1.1 调用内置函数

9.1.2 生成布尔值

9.1.3 数值函数

9.1.4 字符串作函数

9.1.4.1 有关 sub()、gsub() 和 gensub() 的 ' \ ' 和 ' & ' 的更多信息

9.1.5 输入/输出功能

9.1.6 时间函数

9.1.7 位作函数

9.1.8 获取类型信息

9.1.9 字符串翻译函数

9.2 用户定义的函数

9.2.1 函数定义语法

9.2.2 函数定义示例

9.2.3 调用用户定义的函数

9.2.3.1 编写函数调用

9.2.3.2 控制变量范围

9.2.3.3 按值或按引用传递函数参数

9.2.3.4 有关调用函数的其他要点

9.2.4 return 语句

9.3 变量类型是动态的

9.3.1 标准 awk 中的动态键入

9.3.2 在 gawk 中动态输入

9.4 间接函数调用

9.5 总结

第二部分:

用 awk 解决问题

10 awk 函数库

10.1 命名库函数全局变量

10.2 常规编程

10.2.1 将字符串转换为数字

10.2.2 断言

10.2.3 舍入数字

10.2.4 悬崖随机数生成器

10.2.5 在字符和数字之间进行翻译

10.2.6 将数组合并为字符串

10.2.7 管理一天中的时间

10.2.8 一次读取整个文件

10.2.9 引用要传递给 Shell 的字符串

10.2.10 检查值是否为数字

10.2.11 生成 CSV 数据

10.3 数据文件管理

10.3.1 记录数据文件边界

10.3.2 重新读取当前文件

10.3.3 检查可读数据文件

10.3.4 检查零长度文件

10.3.5 将工作分配视为文件名

10.4 处理命令行选项

10.5 读取用户数据库

10.6 读取 Group 数据库

10.7 遍历数组中的数组

10.8 总结

10.9 练习

11 实用的 awk 程序

11.1 运行示例程序

11.2 为了乐趣和利润而重新发明轮子

11.2.1 剪切字段和列

11.2.2 在文件中搜索正则表达式

11.2.3 打印出用户信息

11.2.4 将大文件分割成多个部分

11.2.5 将输出复制到多个文件中

11.2.6 打印非重复的文本行

11.2.7 计数

11.2.7.1 现代字符集

11.2.7.2 扩展简介

11.2.7.3 的代码 wc.awk

11.3 awk 程序的抓包

11.3.1 在文档中查找重复的单词

11.3.2 闹钟程序

11.3.3 音译字符

11.3.4 打印邮寄标签

11.3.5 生成单词使用计数

11.3.6 从未排序的文本中删除重复项

11.3.7 从 Texinfo 源文件中提取程序

11.3.8 简单的流编辑器

11.3.9 使用库函数的简单方法

11.3.10 从字典中查找 Anagram

11.3.11 现在 For Something Completely Different

11.4 总结

11.5 练习

第三部分:

超越标准,傻瓜

12 gawk 的高级功能

12.1 允许非十进制 Importing 数据

12.2 布尔类型化值

12.3 控制数组遍历和数组排序

12.3.1 控制数组遍历

12.3.2 使用 gawk 对数组值和索引进行排序

12.4 与其他进程的双向通信

12.5 使用 gawk 进行网络编程

12.6 对 awk 程序进行性能分析

12.7 在运行之间保留数据

12.8 内置功能与扩展

12.9 总结

13 使用 gawk 进行国际化

13.1 国际化和本地化

13.2 GNU gettext

13.3 国际化 awk 程序

13.4 翻译 awk 程序

13.4.1 提取标记的字符串

13.4.2 重新排列 printf 参数

13.4.3 awk 可移植性问题

13.5 一个简单的国际化示例

13.6 Gawk 会说你的语言

13.7 总结

14 调试 awk 程序

14.1 gawk 调试器简介

14.1.1 常规调试

14.1.2 调试概念

14.1.3 awk 调试

14.2 gawk 调试会话示例

14.2.1 如何启动 Debugger

14.2.2 查找 Bug

14.3 主要 Debugger 命令

14.3.1 断点控制

14.3.2 执行控制

14.3.3 查看和更改数据

14.3.4 使用堆栈

14.3.5 获取有关程序和调试器状态的信息

14.3.6 其他命令

14.4 Readline 支持

14.5 限制

14.6 总结

15 gawk 中的命名空间

15.1 标准 awk 的单个命名空间

15.2 限定名称

15.3 默认命名空间

15.4 更改名称空间

15.5 名称空间和组件命名规则

15.6 内部名称管理

15.7 命名空间示例

15.8 命名空间和其他 gawk 功能

15.9 总结

16 用 gawk 的算术和任意精度算术

16.1 计算机算术的一般描述

16.2 其他须知

16.3 gawk 中的任意精度算术特征

16.3.1 任意精度算术要假释了!

16.3.2 任意精度简介

16.4 浮点运算:Caveat Emptor!

16.4.1 浮点运算不精确

16.4.1.1 许多数字无法精确表示

16.4.1.2 小心比较值

16.4.1.3 错误累积

16.4.1.4 他们在学校里没有讨论的浮点值

16.4.2 获得所需的精度

16.4.3 尝试一些额外的精度和舍入

16.4.4 设置精度

16.4.5 设置舍入模式

16.5 使用 gawk 的任意精度整数算术

16.6 如何检查 MPFR 是否可用

16.7 标准与现有实践

16.8 总结

17 为 gawk 编写扩展

17.1 介绍

17.2 扩展许可

17.3 它在高级别上的工作原理

17.4 接口说明

17.4.1 简介

17.4.2 通用数据类型

17.4.3 内存分配函数和便捷宏

17.4.4 构造函数

17.4.5 管理 MPFR 和 GMP 值

17.4.6 注册函数

17.4.6.1 注册扩展函数

17.4.6.2 注册退出回调函数

17.4.6.3 注册扩展版本字符串

17.4.6.4 自定义输入解析器

17.4.6.5 自定义输出包装器

17.4.6.6 自定义双向处理器

17.4.7 打印消息

17.4.8 更新 ERRNO

17.4.9 请求值

17.4.10 访问和更新参数

17.4.11 符号表访问

17.4.11.1 按名称访问和更新变量

17.4.11.2 Cookie 的变量访问和更新

17.4.11.3 创建和使用缓存的值

17.4.12 数组作

17.4.12.1 数组数据类型

17.4.12.2 数组函数

17.4.12.3 使用数组的所有元素

17.4.12.4 如何创建和填充数组

17.4.13 访问和处理重定向

17.4.14 API 变量

17.4.14.1. API 版本常量和变量

17.4.14.2 GMP 和 MPFR 版本信息

17.4.14.3 信息变量

17.4.15 样板代码

17.4.16 API 版本 1 中的更改

17.5 gawk 如何查找扩展

17.6 示例:某些文件函数

17.6.1 使用 chdir() 和 stat()

17.6.2 chdir() 和 stat() 的 C 代码

17.6.3 集成扩展

17.7 gawk 分发中的示例扩展

17.7.1 与文件相关的函数

17.7.2 fnmatch() 接口

17.7.3 fork()、wait() 和 waitpid() 的接口

17.7.4 启用就地文件编辑

17.7.5 字符和数值:ord() 和 chr()

17.7.6 读取目录

17.7.7 倒车输出

17.7.8 双向 I/O 示例

17.7.9 转储和恢复阵列

17.7.10 读取整个文件

17.7.11 扩展时间函数

17.7.12 API 测试

17.8 gawkextlib 项目

17.9 总结

17.10 练习

这也行,从linux命令立马变得高大上了。后续会总结awk语言的常用案例。

---END---

相关推荐
晨曦启明7113 分钟前
Linux云计算SRE-第十八周
linux·运维·云计算
暴躁的小胡!!!28 分钟前
Linux权限维持之vim python 扩展后门(五)
linux·运维·服务器·网络·安全
优维科技EasyOps32 分钟前
优维眼中的Manus:AI工程化思维重构Agent的运维端启示
运维·人工智能·重构
亭墨35 分钟前
linux0.11内核源码修仙传第五章——内存初始化(主存与缓存)
linux·c语言·驱动开发·学习·缓存·系统架构
追寻光1 小时前
Linux 配置静态 IP
linux
圣圣不爱学习1 小时前
Calico-BGP FullMesh模式与RR模式 Day04
运维·网络
zhgjx-dengkewen1 小时前
华为eNSP:实验 OSPF单区域
运维·网络·华为·智能路由器
爱敲代码的边芙1 小时前
Golang:实时消息交互系统
运维·服务器
誓约酱1 小时前
(每日一题) 力扣 283 移动零
linux·c语言·数据结构·c++·算法·leetcode
快起床啊你1 小时前
【linux网络编程】浏览网页时客户端与服务器之间数据交互的完整过程
linux