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




























