网站搜索

Linux中的awk命令


awk 命令不仅仅是一条命令;它是一种脚本语言,就像 bash 一样。awk 命令用于高级模式扫描、数据提取和文本操作。由于其脚本支持,它对于 Linux 高级用户非常有用,无论是管理员、开发者还是 Linux 爱好者。例如,系统管理员可以迅速检查,例如日志处理/分析、跟踪网络 IP、生成报告和监控系统任务。

如果您希望在awk方面具备扎实的技术基础,本指南提供了关于awk命令的简要教程,包括其使用案例和示例。

awk Linux 命令

awk命令包含编程语言特性。由于其多种用途,awk已超越了其命令行竞争对手,如grep、cut等。因此,在深入探讨awk命令示例之前,让我们先讨论以下内容:

  • awk命令比grep、cut和其他竞争者更好在哪里?
  • awk命令的语法
  • awk命令可以用于哪些操作?

awk命令比grep、cut和其他竞争者更好吗?

让我们快速看一下为什么awk优于grep、cut和其他竞争对手。

  • awk 命令有内置变量,默认情况下是静默使用的。例如,"FS" 允许你用某个字符分割字段,你可以访问并对它们进行操作。
  • awk 支持循环、变量、条件、数组和函数,而这些在任何 awk 的竞争对手中都不受支持。
  • 数据可以通过使用其他命令没有的内置变量以美观的方式呈现。

awk命令的语法

awk 'pattern {action}' file

该命令上的引号是可选的。当使用多个模式和操作时,您需要放置引号;否则,您不必每次都使用它们。以下是awk的进一步细分:

“file” 是正在应用 “awk” 的文件名称。‘模式 {动作}’ 是 awk 的核心部分:

  • „模式“:表示一个条件,即可以是正则表达式,通常留空以匹配所有行。
  • “行动”:在成功匹配模式后执行的操作。

awk 命令可以用于哪些操作

awk 脚本语言广泛用于文本处理。让我们讨论一下可以使用 awk 执行哪些文本处理操作:

  • 模式扫描和处理。
  • 文本过滤、转换、编辑/修改。
  • 从字段或整个字段中提取数据。
  • 文件处理,即单个、多个,支持不同类型的文件处理
  • 格式化输出,即将输出放入另一个文件中,并支持打印
  • 数学计算,即使用条件和循环支持
  • 对数据的控制操作,即,开始,结束
  • 系统监控,即使用awk与其他Linux命令获取过滤结果。

这就是对awk命令基础知识的理解。现在,让我们深入探讨一些例子,以便进行实践学习。

awk命令示例

这里提供的awk示例是在两个文件上进行实验的,“students.txt ”和“class.txt ”。

“students.txt” 文件的内容:

class.txt 的内容:

让我们从基本用例开始。

使用awk打印

打印是awk命令的主要操作。可以随时以任何形式打印数据。

示例 1:打印所有(在单个或多个文件中)

在“{action}”部分使用打印功能打印文件的内容:

awk '{print}' file

示例 2:打印特定列

请在 n 的位置写上列号,以仅显示该列的数据:

awk '{print $n}' file

示例 3:从文件中打印特定范围的数据

您可以指定列范围以仅检索特定数据:

awk 'NR==4, NR==8' file

示例 4:更新任何字段的值并打印它

您需要指定要更新的字段及其值。然后,您可以打印它或将输出存储在其他文件中。

这是一个演示:

awk '{$3 = "New Value"; print}' file

只是对终端的更新,原始内容保持不变。

示例 5:从多个文件打印

awk命令可以应用于多个文件。以下是其工作原理:

awk '{print $1}' file1 file2

该命令将打印两个不同文件的第一列/字段:

匹配特定表达式 | 使用正则表达式的awk

表达式与“awk”命令一起使用,以匹配文件中的特定模式或单词,并对其执行任何操作。

示例6:匹配确切的单词

下面的命令匹配表达式,并根据匹配结果执行操作。以下是一个简单的例子:

awk '/Software/ {print}' file

该命令检查是否包含“软件”这个词,并打印所有包含“软件”这个词的数据记录。

示例7:匹配字符的开头

“ carrot ”符号用于匹配文件开头的字符,然后可以执行进一步操作。以下是实际例子:

awk '/^110/ {print}' file

打印以“110”开头的行:

示例8:匹配端点字符

同样,结束字符也可以指定以匹配并打印(或执行任何其他操作):

awk '/Year$/ {print}' file

上述命令匹配“年份”,并打印所有包含“年”这个词的记录。

额外奖励:其他正则表达式字符

以下是可以与 awk 一起使用以获得更精确输出的其他正则表达式运算符:

正则表达式字符描述
[ax]仅选择 a 和 x 字符
[a-x]选择所有在 a-x 范围内的字符。
\w选择一个词
\s空格字符
\d选择一个数字。

使用 awk 格式化数据 | awk 变量(NR、NF、FS、FNR、OFS、ORS)

awk 变量是用于处理和操作数据的内置变量。每个变量都有其自己的目的,并引用记录或字段。让我先向您介绍所有这些变量:

NR (记录数量):

正在处理的记录数量,即如果文件有10条记录(行),则NR的值将范围从1到10。

示例 9:打印记录数

打印文件中数据的记录编号:

awk '{print NR, $2}' filename

示例 10:获取磁盘使用报告

根据NR,管理员可以分析磁盘使用报告:

df -h | awk 'NR>1 { print $1, $5 }'

该命令从 df -h 命令获取输入,然后通过 awk 管道获取每个文件系统的文件系统名称($1)和已用百分比($5)。

同样,可以使用awk中的NR来检查其他资源的性能和进展。

NF (字段数量):

表示每条记录中的字段数量。

示例 11:获取文件中的字段数量

让我们通过以下内容来看一下:

awk '{print NF}' file

该命令打印目标文件中每条记录的“NF”字段数量:

字段分隔符:

这是用于分隔字段的字符。默认情况下它是空格,对于 Excel 文件则是逗号。

示例12:打印字段分隔符

awk ‘{print FS, $4}’ file

该命令打印字段分隔符:

FNR(记录文件编号):

在处理多个文件时,计算每个文件的记录数量。例如,当处理单个文件时,NR 值始终从 1 开始,并在处理多个文件时继续这个数字,而 FNR 值从新的文件开始为 1,而不是像 NR 那样继续。

示例 13:打印带字段的字段号码记录

awk '{print FNR, $4}' file

该命令打印字段编号和第四个字段:

输出字段分隔符:

这是输出字段分隔符,即分隔输出字段的字符。默认的输出字段分隔符是空格(“ ”)。但是,您可以通过OFS关键字更改或设置新的字段分隔符:

示例 14:更改输出字段分隔符

我们来实际理解一下:

awk 'BEGIN {OFS=" - "} {print $3, $4}' file

该命令将从指定文件打印第3列和第4列,并将“—”设置为新的输出字段分隔符:

ORS(输出记录分隔符):

同样,OFS,这个ORS代表输出记录分隔符。默认情况下它是空格,但我们可以像下面的演示那样进行更改。

示例 15:更改输出记录分隔符

以下命令将把记录分隔符更改为“|”:

awk '{ORS =" | "} {print}' filename

该记录分隔符现在被设置为“ | ”仅用于该特定输出。

高级 awk 示例

到目前为止,我们已经讨论了一些 awk 示例的基本和中级用例。由于 awk 还包含编程语言的特性,因此在这里我们还将讨论 awk 在一些高级用例中的功能:

示例16:在文件中查找最大的字段

以下命令使用 if-else 语句来提供文件中最长行的长度。这里有一个示例来做到这一点:

awk '{if (length($0) > max) max = length($0)} END {print max}' file
  • “awk” 是命令关键字,而“file” 是正在执行操作的文件。其余的细节在引号中。
  • 长度($0)表达式获取当前行的长度并检查它是否大于“max”。
  • 如果条件为真,“length($0)” 将存储在 “max” 中,并且 “max” 将在最后打印出来。

同样,如果你想检查/获取一行的最小长度,那么它将是:

awk '{if (length($1) > min) min = length($1) } END {print min}' file

示例 17:获取字段值的总和

使用awk,您可以计算任何字段的总和。以下是实际演示:

awk '{sum += $1} END {print "Total:", sum}' file
  • 一个和变量最初存储来自第一个字段的第一个值($1)
  • $1(第一个字段)值正在被添加到已存储的总值中。

示例18:在列中查找最大值

在这里,m是存储最大值的变量:

awk 'BEGIN{m=0} {if($2 > m) m=$1} END {print "Maximum Value:", m}' file

这是命令的分解:

  • 一个变量“m”被初始化,然后,如果“第二列”的值大于m,则将“第二列”的值存储在m中。
  • 这将持续到条件“$2 > m”变为false。

示例 19:统计特定单词的出现次数
s 是循环变量,f 显示频率,“Year” 是要搜索的单词,以查找条目数量:

awk '{for(s=1;s<=NF;s++) f[$s]++} END {for(Year in f) print Year, f[Year]}' file
  • “for 循环”使用 (NF) 在每个记录中循环所有条目。
  • “f[$s]++” 表达式将每个单词存储在一个关联数组“f”中,并计算它出现的次数。
  • 在结束块中,for循环打印数组中的每个唯一单词及其频率(作为值)。

示例 20:监控日志文件

监控Apache访问日志文件:

awk '{print $n}' /var/log/apache2/access.log

同样,您可以跟踪iptables.log文件,以跟踪触发防火墙日志的IP地址。您可以查看/打印iptables.log文件,目的是在/var/log/iptables.log位置可用。

示例 21:搜索和分析 | 使用 grep 的 AWK

grep 以其数据过滤和搜索而闻名,而 awk 则用于提取和操作数据。让我们看看实际操作,检查这些工具如何协同工作:

grep "Software" file | awk "{print $3}"

以下是上述命令的详细信息:

  • grep "软件" 只会过滤和选择包含 "软件" 关键字的记录。
  • awk 命令打印包含“软件”一词的列。

同样,grep 和 awk 可以应用于其他日志文件或系统文件,以过滤和分析特定的日志相关信息。

示例 22:用 sed 替代 AWK

“sed”命令用于编辑和处理文本。因此,awk命令的输出可以与sed进行管道传输,以对输出执行特定操作,或者单独处理:

让我们看看实际操作,使用以下简单命令:

awk '{print $3, $4}' file | sed 's/ /,/g'

awk命令打印文件的第3列和第4列,而sed命令全局替换文档文件中的空格为,。

awk 中的函数

由于awk是一种脚本语言,它有一长串用于执行各种功能的函数。其中一些在上述示例中使用过,即length(n)。在这里,我们将详细阐述几个函数及其使用案例。

在awk中使用函数进行替换

awk有“sub”和“gsub”作为两个替换函数;让我们通过示例来理解这些:

注意:将在此文件上实验“sub”和“gsub”函数。

示例 23:仅替换第一次出现(在每条记录中)| awk 使用 sub

“sub”函数在每条记录中替换匹配单词/表达式的第一次出现。这里有一个示例命令以便理解:

awk '{sub("Year", "Y"); print}' file

第一个出现的“Year”这个词将被替换为“Y”:

示例 24:用 gsub 替换所有实例的单词/表达式 | awk

“gsub” 全局替换匹配的关键字,即所有匹配关键字的出现次数。以下是一个例子:

awk '{ gsub("Year", "Y"); print }' file

现在,所有的出现都会被替换:

示例 25:获取 UNIX 时间戳 | 使用 awk 和 systime()

awk 命令有 systime() 函数可以获取字段或整个系统的 UNIX 时间戳。我们来练习一下:

awk 'BEGIN {print systime()}' file

该命令将打印文件中每条记录的 UNIX 时间戳(最后一次修改时):

类似地,您可以使用以下命令获取整体 UNIX 时间:

awk 'BEGIN {print systime()}'

其他 awk 函数:

由于其脚本支持,awk有一个很长的支持函数列表。以下表格列出了一些这些函数,并描述了它们的目的及语法:

awk 函数描述/目的语法
length()
当前行的长度awk '{print length()}' 文件
substr(a, b, c)
从字符串a中提取子串,起始长度为b,总长度为c。awk '{print substr($a, b, c)}' 文件
split(a,b,c)
使用分隔符 c 将字符串 a 拆分为数组 b。awk '{split($a, arr, ":"); print arr[a] }' 文件
tolower(a)
将字母a转换为小写awk ‘{print tolower($a)}’ 文件
toupper(a)
将字母a转换为大写awk ‘{print tolower($a)}’ 文件
int(a)
将$a 转换为整数awk '{print int($a)} file'
sqrt(a)
$a 的平方根。awk '{print sqrt($a)}' 文件
srand()
播种一个随机生成器awk 'BEGIN { srand(); print rand() }'
rand()
随机生成器

这就是本教程的全部内容。

结论

awk 工具是一个有效的命令行工具,也可以作为脚本语言。从基本的搜索和查找,到用于高级脚本编写,awk 是一个完整的工具包。

这篇文章简要概述了Linux中awk命令的使用,并提供了一些高级示例。

常见问题解答

问 1:awk 代表什么?

awk的名称源于其发明者,即Aho、Weinberger和Kernighan。他们于1977年在AT&T贝尔实验室设计了awk。

问题 2:在Linux中,awk是什么?

答案:awk 是一个强大的命令行工具和脚本语言。awk 用于:读取数据、搜索和扫描模式、打印、格式化、计算、分析等等。对于这些用例,awk 有时必须与 grep、sed 和普通正则表达式一起使用。

问题3:awk ‘{print $2}’是什么意思?

awk ‘{print $2}’ 将在终端打印文件的第二个字段。如果与多个文件一起使用,则将打印多个文件的第二个字段。

问题4:awk和grep之间有什么区别?

grep 进行搜索和过滤,而 awk 工具提取、处理和分析数据。awk 和 grep 一起使用用于搜索和分析目的,即 grep 提供搜索/过滤支持,而 awk 执行分析。

问题5:awk和bash之间有什么区别?

对于专业脚本,推荐使用 Bash。然而,当需要在终端上进行脚本编写和基本操作时,awk 是不错的选择。awk 和 bash 都是脚本语言。然而,相比于 bash,awk 更快地执行简单任务。

Q6: 我如何使用awk进行替换?

awk支持两个替换函数,即sub和gsub。sub用于替换匹配单词的第一个出现,而gsub用于全局替换匹配单词。