通用线程:Awk 实例,第 1 部分
一种名称很奇特的优秀语言介绍 Daniel Robbins
总裁兼 CEO,Gentoo Technologies, Inc. 2000 年 12 月 转载自:IBM developerWorks 中国网站
Awk 是一种非常好的语言,同时有一个非常奇怪的名称。在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 将使您迅速掌握 awk 编程技巧。随着本系列的进展,将讨论更高级的主题,最后将演示一个真正的高级 awk 演示程序。
捍卫 awk
在本系列文章中,我将使您成为精通 awk 的编码人员。我承认,awk 并没有一个非常好听且又非常“时髦”的名字。awk 的 GNU 版本(叫作 gawk)听起来非常怪异。那些不熟悉这种语言的人可能听说过 "awk", 并可能认为它是一组落伍且过时的混乱代码。它甚至会使最博学的 UNIX 权威陷于错乱的边缘(使他不断地发出 "kill -9!" 命令,就象使用咖啡机一样)。 的确,awk 没有一个动听的名字。但它是一种很棒的语言。awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。与某些语言不同,awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创建)。awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。
您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。
现在,解释
{ print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。这里是另一个 awk 示例,它的作用与上例完全相同:
在 awk 中,
$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个示例:
只要将 "" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于 /etc/passwd 文件中的每一行,awk 都输出一个空白行。再次说明, awk 对输入文件中的每一行都执行这个脚本。以下是另一个示例:
运行这个脚本将在您的屏幕上写满 hiya。:)
上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理
print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。以下是另一个示例:
以下是该脚本输出的摘录:
如您所见,awk 打印出 /etc/passwd 文件的第一和第三个字段,它们正好分别是用户名和用户标识字段。现在,当脚本运行时,它并不理想 -- 在两个输出字段之间没有空格!如果习惯于使用 bash 或 python 进行编程,那么您会指望
print $1 $3 命令在两个字段之间插入空格。然而,当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:
以这种方式调用 print 时,它将连接
$1 、" " 和 $3 ,创建 可读的输出。当然,如果需要的话,我们还可以插入一些文本标签:
这将产生以下输出:
外部脚本
将脚本作为命令行自变量传递给 awk 对于小的单行程序来说是非常简单的,而对于多行程序,它就比较复杂。您肯定想要在外部文件中撰写脚本。然后可以向 awk 传递 -f 选项,以向它提供此脚本文件:
将脚本放入文本文件还可以让您使用附加 awk 功能。例如,这个多行脚本与前面的单行脚本的作用相同,它们都打印出 /etc/passwd 中每一行的第一个字段:
这两个方法的差别在于如何设置字段分隔符。在这个脚本中,字段分隔符在代码自身中指定(通过设置 FS 变量),而在前一个示例中,通过在命令行上向 awk 传递 -F":" 选项来设置 FS。通常,最好在脚本自身中设置字段分隔符,只是因为这表示您可以少输入一个命令行自变量。我们将在本文的后面详细讨论 FS 变量。
BEGIN 和 END 块
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。 awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
当然,可以使用更复杂的规则表达式。以下脚本将只打印包含浮点数的行:
表达式和块
还有许多其它方法可以选择执行代码块。我们可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时, awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 fred 的所有行中的第三个字段。如果当前行的第一个字段不等于 fred ,awk 将继续处理文件而不对当前行执行 print 语句:
awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定规则表达式。如果某一行的第五个字段包含字符序列
root , 那么以下示例将只打印这一行中的第三个字段:
这两个脚本的功能完全一样。第一个示例中,布尔表达式放在代码块外面。而在第二个示例中,将对每一个输入行执行代码块,而且我们使用
if 语句来选择执行 print 命令。这两个方法都可以使用,可以选择最适合脚本其它部分的一种方法。以下是更复杂的 awk
if 语句示例。可以看到,尽管使用了复杂、嵌套的条件语句,if 语句看上去仍与相应的 C 语言 if 语句一样:
使用
if 语句还可以将代码:
转换成:
这两个脚本都只输出不包含
matchme 字符序列的那些行。此外,还可以选择最适合您的代码的方法。它们的功能完全相同。awk 还允许使用布尔运算符 "||"(逻辑与)和 "&&"(逻辑或),以便创建更复杂的布尔表达式:
这个示例只打印第一个字段等于
在 BEGIN 块中,将整数变量
字符串化变量
awk 的优点之一就是“简单和字符串化”。我认为 awk 变量“字符串化”是因为所有 awk 变量在内部都是按字符串形式存储的。同时,awk 变量是“简单的”,因为可以对它执行数学操作,且只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。要理解我的观点,请研究以下这个示例:
awk 将输出:
有趣吧!虽然将字符串值
1.01 赋值给变量 x ,我们仍然可以对它加 一。但在 bash 和 python 中却不能这样做。首先,bash 不支持浮点运算。而且,如果 bash 有“字符串化”变量,它们并不“简单”;要执行任何数学操作,bash 要求我们将数字放到丑陋的 $( ) ) 结构中。如果使用 python,则必须在对 1.01 字符串执行任何数学运算之前,将它转换成浮点值。虽然这并不困难,但它仍是附加的步骤。如果使用 awk,它是全自动的,而那会使我们的代码又好又整洁。如果想要对每个输入行的第一个字段乘方并加一,可以使用以下脚本:
如果做一个小实验,就可以发现如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。
众多运算符
awk 的另一个优点是它有完整的数学运算符集合。除了标准的加、减、乘、除,awk 还允许使用前面演示过的指数运算符 "^"、模(余数)运算符 "%" 和其它许多从 C 语言中借入的易于使用的赋值操作符。 这些运算符包括前后加减(
字段分隔符
awk 有它自己的特殊变量集合。其中一些允许调整 awk 的运行方式,而其它变量可以被读取以收集关于输入的有用信息。我们已经接触过这些特殊变量中的一个,FS。前面已经提到过,这个变量让您可以设置 awk 要查找的字段之间的字符序列。我们使用 /etc/passwd 作为输入时,将 FS 设置成 ":"。当这样做有问题时,我们还可以更灵活地使用 FS。 FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。如果正在处理由一个或多个 tab 分隔的字段,您可能希望按以下方式设置 FS:
以上示例中,我们使用特殊 "+" 规则表达式字符,它表示“一个或多个前一字符”。
如果字段由空格分隔(一个或多个空格或 tab),您可能想要将 FS 设置成以下规则表达式:
这个赋值表达式也有问题,它并非必要。为什么?因为缺省情况下,FS 设置成单一空格字符,awk 将这解释成表示“一个或多个空格或 tab”。在这个特殊示例中,缺省 FS 设置恰恰是您最想要的!
复杂的规则表达式也不成问题。即使您的记录由单词 "foo" 分隔,后面跟着三个数字,以下规则表达式仍允许对数据进行正确的分析:
字段数量
接着我们要讨论的两个变量通常并不是需要赋值的,而是用来读取以获取关于输入的有用信息。第一个是 NF 变量,也叫做“字段数量”变量。awk 会自动将该变量设置成当前记录中的字段数量。可以使用 NF 变量来只显示某些输入行:
当然,也可以在条件语句中使用 NF 变量,如下:
记录号
记录号 (NR) 是另一个方便的变量。它始终包含当前记录的编号(awk 将第一个记录算作记录号 1)。迄今为止,我们已经处理了每一行包含一个记录的输入文件。对于这些情况,NR 还会告诉您当前行号。然而,当我们在本系列以后部分中开始处理多行记录时,就不会再有这种情况,所以要注意!可以象使用 NF 变量一样使用 NR 来只打印某些输入行:
另一个示例:
awk 提供了适合各种用途的附加变量。我们将在以后的文章中讨论这些变量。
参考资料
|
记录、循环和数组
总裁兼 CEO,Gentoo Technologies, Inc.
2001 年 1 月
<!-- END title and author lines --><!-- Start TOC -->
内容:
|
|
|
|
awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具。/etc/passwd 是 UNIX 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户和用户标识,以及其它信息。在我的前一篇文章中,我演示了 awk 如何轻松地分析这个文件。我们只须将 FS(字段分隔符)变量设置成 ":"。
Jimmy the Weasel |
BEGIN { |
BEGIN { |
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345 |
在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串。我们使用此功能在同一行上的三个字段之间插入一个逗号和空格 (", ")。这个方法虽然有用,但比较难看。与其在字段间插入 ", " 字符串,倒不如让通过设置一个特殊 awk 变量 OFS,让 awk 完成这件事。请参考下面这个代码片断。
print "Hello", "there", "Jim!" |
Hello there Jim! |
BEGIN { |
假设我们编写了一个脚本,它将地址列表转换成每个记录一行,且用 tab 定界的格式,以便导入电子表格。使用稍加修改的 address.awk 之后,就可以清楚地看到这个程序只适合于三行的地址。如果 awk 遇到以下地址,将丢掉第四行,并且不打印该行:
Cousin Vinnie |
BEGIN { |
print "/n"
。
Jimmy the Weasel 100 Pleasant Drive San Francisco, CA 12345 |
我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。它类似于其它语言中的 "repeat...until" 循环。以下是一个示例:
{ |
awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:
for ( initial assignment; comparison; increment ) { |
for ( x = 1; x <= 4; x++ ) { |
iteration 1 |
此外,如同 C 语言一样,awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断:
while (1) { |
1
永远代表是真,这个 while 循环将永远运行下去。以下是一个只执行十次的循环:
x=1 |
x=1 |
for ( x=1; x<=21; x++ ) { |
x
,因为 for 循环会自动增加 x
。
myarray[1]="jim" |
myarray
,并将元素 myarray[1]
设置成 "jim"。执行了第二个赋值语句后,数组就有两个元素了。定义之后,awk 有一个便利的机制来迭代数组元素,如下所示:
for ( x in myarray ) { |
myarray
中的每一个元素。当对于 for 使用这种特殊的 "in" 形式时,awk 将 myarray
的每个现有下标依次赋值给 x
(循环控制变量),每次赋值以后都循环一次循环代码。虽然这是一个非常方便的 awk 功能,但它有一个缺点 -- 当 awk 在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是:
jim |
456 |
a="1" |
c
等于 6
。由于 awk 是“字符串化”的,添加字符串 "1" 和 "2" 在功能上并不比添加数字 1 和 2 难。这两种情况下,awk 都可以成功执行运算。awk 的“字符串化”性质非常可爱 -- 您可能想要知道如果使用数组的字符串下标会发生什么情况。例如,使用以下代码:
myarr["1"]="Mr. Whipple" |
myarr["1"]="Mr. Whipple" |
myarr["1"]
和 myarr[1]
看作数组的两个独立元素,还是它们是指同一个元素?答案是它们指的是同一个元素,awk 将打印 "Mr. Whipple",如同第一个代码片断一样。虽然看上去可能有点怪,但 awk 在幕后却一直使用数组的字符串下标!
myarr["name"]="Mr. Whipple" |
myarr["name"]
,那么我们就在使用关联数组。从技术上讲,如果我们使用字符串下标, awk 的后台操作并没有什么不同(因为即便使用“整数”下标,awk 还是会将它看作是字符串)。但是,应该将它们称作关联数组 -- 它听起来很酷,而且会给您的上司留下印象。字符串化下标是我们的小秘密。;)谈到数组时,awk 给予我们许多灵活性。可以使用字符串下标,而且不需要连续的数字序列下标(例如,可以定义
myarr[1]
和 myarr[1000]
,但不定义其它所有元素)。虽然这些都很有用,但在某些情况下,会产生混淆。幸好,awk 提供了一些实用功能有助于使数组变得更易于管理。fooarray
的元素 1
,输入:
delete fooarray[1] |
if ( 1 in fooarray ) { |
本文中,我们已经讨论了许多基础知识。下一篇中,我将演示如何使用 awk 的数学运算和字符串函数,以及如何创建您自己的函数,使您完全掌握 awk 知识。我还将指导您创建支票簿结算程序。那时,我会鼓励您编写自己的 awk 程序。请查阅以下参考资料。
- 请阅读 developerWorks 上的 awk 实例,第 1 部分。
- 如果想看好的老式书籍,O'Reilly 的 sed & awk, 2ndEdition 是极佳选择。
- 请参考 comp.lang.awkFAQ。它还包含许多附加 awk 链接。
- Patrick Hartigan 的 awk tutorial 还包括了实用的 awk 脚本。
- Thompson's TAWKCompiler 将 awk 脚本编译成快速二进制可执行文件。可用版本有 Windows 版、OS/2 版、DOS 版和 UNIX 版。
- The GNUAwk User's Guide 可用于在线参考。
通用线程:Awk 实例,第 3 部分
字符串函数和……支票簿?
总裁兼 CEO,Gentoo Technologies, Inc.
2001 年 4 月
转载自:IBM developerWorks 中国网站
<!-- Start TOC -->
内容:
|
|||||||||||||
|
|||||||||||||
|
|||||||||||||
|
|||||||||||||
|
虽然大多数情况下 awk 的 print 语句可以完成任务,但有时我们还需要更多。在那些情况下,awk 提供了两个我们熟知的老朋友 printf() 和 sprintf()。是的,如同其它许多 awk 部件一样,这些函数等同于相应的 C 语言函数。printf() 会将格式化字符串打印到 stdout,而 sprintf() 则返回可以赋值给变量的格式化字符串。如果不熟悉 printf() 和 sprintf(),介绍 C 语言的文章可以让您迅速了解这两个基本打印函数。在 Linux 系统上,可以输入 "man 3 printf" 来查看 printf() 帮助页面。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
简短注释 -- 调用 length()、sub() 或 gsub() 时,可以去掉最后一个自变量,这样 awk 将对 $0(整个当前行)应用函数调用。要打印文件中每一行的长度,使用以下 awk 脚本:
|
几星期前,我决定用 awk 编写自己的支票簿结算程序。我决定使用简单的 tab 定界文本文件,以便于输入最近的存款和提款记录。其思路是将这个数据交给 awk 脚本,该脚本会自动合计所有金额,并告诉我余额。以下是我决定如何将所有交易记录到 "ASCII checkbook" 中:
|
|
|
|
|
以下是其它三个执行簿记的函数。我们即将见到的主代码块将调用这些函数之一,按顺序处理支票簿文件的每一行,从而将相应交易记录到 awk 数组中。有三种基本交易,贷方 (doincome)、借方 (doexpense) 和转帐 (dotransfer)。您会发现这三个函数全都接受一个自变量,叫作 mybalance。mybalance 是二维数组的一个占位符,我们将它作为自变量进行传递。目前,我们还没有处理过二维数组;但是,在下面可以看到,语法非常简单。只须用逗号分隔每一维就行了。
|
以下是主代码块,它包含了分析每一行输入数据的代码。请记住,由于正确设置了 FS,可以用 $ 1 引用第一个字段,用 $2 引用第二个字段,依次类推。调用 doincome() 和其它函数时,这些函数可以从函数内部访问 curmonth、$2、$3 和金额的当前值。请先研究代码,在代码之后可以见到我的说明。
|
|
|
我使用这个程序的更高级版本来管理我的个人和企业财务。我的版本(由于篇幅限制不能在此涵盖)会打印出收入和费用的月度明细分类帐,包括年度总合、净收入和其它许多内容。它甚至以 HTML 格式输出数据,因此我可以在 Web 浏览器中查看它。:) 如果您认为这个程序有用,我建议您将这些特性添加到这个脚本中。不必将它配置成要 记录任何附加信息;所需的全部信息已经在 balance 和 balance2 里面了。只要升级 END 块就万事具备了!
- 请阅读 Daniel 在 developerWorks 上发表的 awk 系列中的前几篇文章:awk 实例,第 1 部分和第 2 部分。
- 如果想看好的老式书籍,O'Reilly 的 sed & awk, 2ndEdition 是极佳选择。
- 请参考 comp.lang.awkFAQ。它还包含许多附加 awk 链接。
- Patrick Hartigan 的 awk tutorial 还包括了实用的 awk 脚本。
- Thompson's TAWKCompiler 将 awk 脚本编译成快速二进制可执行文件。可用版本有 Windows 版、OS/2 版、DOS 版和 UNIX 版。
- The GNUAwk User's Guide 可用于在线参考。
Daniel Robbins 居住在新墨西哥州的 Albuquerque。他是 Gentoo Technologies, Inc. 的总裁兼 CEO,Gentoo Linux(用于 PC 的高级 Linux)和 Portage 系统(Linux 的下一代移植系统)的创始人。他还是 Macmillan 书籍 Caldera OpenLinux Unleashed、SuSE Linux Unleashed 和 Samba Unleashed 的合作者。Daniel 自二年级起就与计算机结下不解之缘,那时他首先接触的是 Logo 程序语言,并沉溺于 Pac-Man 游戏中。这也许就是他至今仍担任 SONY Electronic Publishing/Psygnosis 的首席图形设计师的原因所在。Daniel 喜欢与妻子 Mary 和新出生的女儿 Hadassah 一起共度时光。可通过 drobbins@gentoo.org 与 Daniel 联系。
相关推荐
### AWK实例教程知识点解析 #### 一、AWK简介及背景 - **AWK**是一种功能强大的文本处理工具,最初由贝尔实验室的Alfred Aho、Peter Weinberger和Brian Kernighan共同开发,因此得名AWK。尽管这个名字听起来有些...
### 通用线程AWK实例知识点详解 #### 一、AWK语言简介 - **语言特点**:AWK 是一种专为文本处理而设计的编程语言,具备强大的文本处理功能和简洁的语法结构。尽管其名称可能听起来有些怪异,但AWK 的确是一种非常...
【由浅入深AWK实例】是关于UNIX文本处理工具AWK的学习教程,旨在逐步引导读者深入理解并熟练运用AWK编程。AWK是一种功能强大的语言,尤其适用于文本处理和报表生成,其语法简洁,易上手,且具有丰富的特性。 在AWK...
【AWK 实例与编程技巧】是一篇关于学习和理解AWK编程语言的文章,由Daniel Robbins撰写,旨在帮助初学者快速掌握AWK的基本用法,并逐步深入到更高级的主题。AWK是一种强大的文本分析和处理工具,尤其适用于数据提取...
### awk实例入门教程知识点解析 #### 一、awk语言简介 awk是一种专为文本处理设计的强大脚本语言,尤其适用于数据格式化、过滤和报告生成。它的命名来源于三位创造者:Alfred Aho、Peter Weinberger 和 Brian ...
在Unix和Linux操作系统中,`awk`是一个强大的文本分析工具,用于处理结构化的文本数据,如日志文件、CSV文件等。它通过模式匹配和动作来解析和操作文本,是系统管理员和程序员不可或缺的工具之一。`awk`的名字来源于...
以下是一些使用Awk的基本概念和实例: 1. **字段分隔符(Field Separators)**:默认情况下,Awk将空格或制表符作为字段分隔符。你可以使用`-F`选项自定义分隔符,例如`awk -F ":"`将用冒号分隔字段。 2. **模式...
"AWK编程实例指南.txt"很可能是AWK的教程文档,涵盖了基本概念、语法和各种实用案例。这可能包括如何定义模式、动作、字段分隔符,以及如何使用内置变量和函数。通过这个指南,学习者可以了解如何使用AWK进行数据...
要在linux操作系统里打开
### Awk编程基础知识点 #### 一、Awk语言简介 Awk是一种专门设计用于文本处理和报表生成的脚本语言。尽管它的名字听起来有些奇特,但其实它是一种功能强大且设计精巧的语言。Awk的语法简洁明了,易于学习,并且...
sed 和 awk 使用实例 Sed 和 Awk 是两种强大的命令行工具,在 Unix 和 Linux 系统中广泛应用于文本处理和数据处理。本文将通过一些实例来展示 Sed 和 Awk 的使用场景和方法。 一、sed 使用实例 1. 删除 login....
#### 四、常用AWK实例 1. **模式匹配**:筛选包含特定字符串的行,如`awk '/tag/{print}' file`。 2. **字段提取**:选择指定字段输出,如`awk '{print $1,$3,$5}' file`。 3. **去重排序**:结合`sort`命令对数据...
【awk真实实例】这篇文章主要介绍了awk这种强大的文本处理语言,并通过一系列实例帮助新手入门。awk是一种专门用于文本处理和报表生成的语言,虽然它的名字有些奇特,但其功能强大且易于学习。 awk的语法简洁明了,...
在"UNIX Shell awk sed 实例 精解 (第4版)"这本书中,你将发现丰富的实例来帮助你理解这些工具的实际应用。书中的内容可能包括: 1. Bash Shell的基本语法和高级特性,如变量、流程控制、脚本调试等。 2. awk的模式...
最牛逼的Linux awk命令详细介绍和实例快速学习
### grep、sed、awk命令实例大练习 在Linux或Unix环境中,`grep`、`sed`和`awk`是三个非常强大的文本处理工具。通过掌握这些工具的基本用法及高级功能,用户可以高效地处理各种文本文件。下面将详细介绍如何使用...
### Awk命令使用详解 #### 一、Awk简介 Awk是一种强大的文本处理语言,专为高级文本处理和数据分析而设计。它被广泛应用于快速编写脚本来处理文本文件,如日志文件、配置文件等。Awk的核心功能在于能够方便地对文本...
下面是一份 awk 教程,从基础知识到高级应用,涵盖了 awk 的基本概念、语法、函数和应用实例。 awk 基础知识 awk 的基本结构是 pattern{action},其中 pattern 是awk的模式, action 是awk的动作。awk 的模式可以...