Unix/Linux 中的 AWK 命令及示例
AWK简介
Awk 是一种用于处理数据和生成报告的脚本语言。awk 命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑运算符。
Awk 是一种实用程序,它使程序员能够以语句的形式编写小巧但有效的程序,这些语句定义要在文档的每一行中搜索的文本模式以及在行中找到匹配项时要采取的操作。Awk 主要用于模式扫描和处理。它搜索一个或多个文件以查看它们是否包含与指定模式匹配的行,然后执行相关操作。
句法
1 | awk options 'selection _criteria {action }' input-file > output-file |
Options:
1 | -f program-file : Reads the AWK program source from the file |
Awk命令示例
考虑以下文本文件作为以下所有情况的输入文件:
1 | $cat > employee.txt |
- Awk 的默认行为:默认情况下,Awk 打印指定文件中的每一行数据。
1 | $ awk '{print}' employee.txt |
在上面的例子中,没有给出模式。因此这些操作适用于所有行。不带任何参数的打印操作默认打印整行,因此它会打印文件的所有行而不会失败。
- 打印与给定模式匹配的行。
1 | $ awk '/manager/ {print}' employee.txt |
在上面的示例中,awk 命令打印与“manager”匹配的所有行。
- 将一行拆分为字段:对于每条记录(即行),awk 命令默认会以空格字符分隔记录并将其存储在 $n 变量中。如果该行有 4 个单词,则分别存储在 $1、$2、$3 和 $4 中。另外,$0 代表整行。
1 | $ awk -F' ' '{print $1,$4}' employee.txt |
在上面的示例中,$1 和 $4 分别代表“Name”和“Salary”字段。
awk 中的内置变量
awk 的内置变量包括字段变量 $1、$2、$3 等($0 表示整行)——它们将一行文本分成单独的单词或片段,称为字段。
- NR:NR 命令保存当前输入记录的数量。请记住,记录通常是行。Awk 命令对文件中的每个记录执行一次模式/操作语句。
- NF:NF 命令保存当前输入记录中的字段数。
- FS:FS 命令包含用于在输入行上划分字段的字段分隔符。默认值为“空白”,即空格和制表符。可以将 FS 重新分配给另一个字符(通常在 BEGIN 中)以更改字段分隔符。
- RS:RS 命令存储当前记录分隔符。由于默认情况下,输入行是输入记录,因此默认记录分隔符是换行符。
- OFS:OFS 命令存储输出字段分隔符,当 Awk 打印字段时,它会分隔字段。默认值为空格。每当 print 有多个用逗号分隔的参数时,它都会在每个参数之间打印 OFS 的值。
- ORS:ORS 命令存储输出记录分隔符,Awk 打印输出行时,它会分隔输出行。默认为换行符。print 会自动将 ORS 的内容输出到打印内容的末尾。
示例
- 使用 NR 内置变量(显示行号)
1 | $ awk '{print NR,$0}' employee.txt |
在上面的示例中,带有 NR 的 awk 命令打印所有行以及行号。
- 使用 NF 内置变量(显示最后一个字段)
1 | $ awk '{print $1,$NF}' employee.txt |
在上面的示例中,$1 代表姓名,$NF 代表薪水。我们可以使用 $NF 获取薪资,其中 $NF 代表最后一个字段。
- NR内置变量的另一种用途(显示行从3到6
1 | $ awk 'NR==3, NR==6 {print NR,$0}' employee.txt |