当前位置首页 > 建筑/施工 > 施工组织
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

UNIX新手指南第3部分正则表达式

文档格式:DOC| 14 页|大小 146.50KB|积分 10|2022-09-27 发布|文档ID:156776403
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 14
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • UNIX 新手指南,第 3 部分: 正则表达式使用 grep、sed 和 awk级别: 中级Tim McIntire (tm@), 咨询师, 自由撰稿人2007 年 1 月 18 日了解 UNIX® 过滤器的强大功能在本教程中,您将深入了解 grep 系列,包括许多 UNIX 实用程序中的正则表达式语法您还将了解关于流编辑器 sed 的更多信息,并通过示例和解释来研究 awk 模式扫描语言开始之前了解本教程中包含的内容以及如何最好地利用本教程关于本系列这个包括四个部分的系列教程从头开始介绍 UNIX®对于很久没有使用类 UNIX 操作系统的用户来说,这个初始的教程是个很好的温习对于具有 Windows® 使用经验的新的 UNIX 用户来说,它也很有价值,因为其中参考了 Windows,并将两者进行了比较第二个教程重点讲述 vi 文本编辑器,该编辑器是功能最强大(也最神秘)的可用 UNIX 实用程序之一本教程向您讲授有关使用正则表达式的 UNIX 命令行过滤器的知识,包括 grep、sed 和 awk关于本教程要发挥 UNIX 命令行过滤器(如 grep、sed 和 awk)背后的强大功能,您需要非常熟悉正则表达式。

    本教程向新用户讲授其中每个实用程序的功能和如何使用正则表达式来操作文本您将首先使用一个简单和好玩的 grep 示例,然后继续研究 sed 和 awk 的实际示例目标本教程的目标是使 UNIX 和 Linux® 用户习惯于使用这三个可用于快速和高效地搜索和更改数据的强大命令行工具本教程开头将解释许多 UNIX 实用程序(及编程语言)基本框架中使用的正则表达式随后的各个部分将给出与 grep、sed 和 awk 一起使用的正则表达式的示例先决条件对于本教程,您需要对命令行有基本的了解对于本教程的某些部分,了解如何在 UNIX 中使用 stdin、stdout 和 pipe 来处理输入和输出是有所帮助的系统要求在任何运行类 UNIX 操作系统的计算机上拥有您自己的帐户,这是完成本教程所需的要求类 UNIX 操作系统包括 IBM AIX® 操作系统、Linux®、Berkeley Software Distribution (BSD)、Mac OS® X(通过终端来访问命令行),以及其他许多系统正则表达式正则表达式是一个字符串,旨在用于搜索或替换另一个字符串初看起来,这似乎是一个相当基本的功能。

    大多数用户都熟悉几乎每个图形文本编辑器或字处理应用程序中都有的搜索和替换功能如果将这个基本的搜索和替换功能比作计算器,则正则表达式可比作全功能的计算机将正则表达式用于搜索条件的强大功能不应被低估使用正则表达式的过滤器一些基于 UNIX 的最强大命令行工具使用了正则表达式,包括 grep、sed 和 awk(以及包括 Perl 在内的一些编程语言)在从基础 UNIX 命令行用户转变为真正的超级用户时,学习如何使用正则表达式是一个必需步骤存在一些不同版本的正则表达式语法和多个版本的 grep、sed 和 awk,因此本教程将集中于每种实现中都具有的非常标准的最常见构造不要忘了参考您系统的 man 页,以获得有关语法和命令行选项的细节基础在探索使用正则表达式的 UNIX 应用程序之前,了解基础知识是非常重要的在本部分中,您只需继续往下阅读稍后您将在 grep 中尝试一些示例基本搜索正则表达式由一些普通字符和特殊字符组成,其中的特殊字符指示搜索条件 在大多数基本情况下,正则表达式中也许根本就没有使用特殊字符例如,如果您只是希望使用词条 golf 作为搜索条件,则可以输入以下命令:golf这就是一个正则表达式!它搜索单词 golf 的所有实例。

    正则表达式区分大小写,因此这将搜索 golf 的所有实例,但是不会查找 Golf 的实例使用方括号若要同时搜索 golf 和 Golf,您可以使用方括号(它们是正则表达式中的特殊字符),并列出一串要搜索的各个字符这类似于搜索中的搜索(这就是正则表达式背后的神奇之处)[Gg]olf同样的概念也适用于任何字符列表——而不只是用于区分大小写例如,您可能希望搜索 golf 和 gelf(您虚构的一种新体育运动):g[oe]lf句点现在假设您有第三种体育运动 gilf,您也希望对其进行检查使用您到目前为止已学到的知识,一种方法是在您的搜索条件中使用 o、e 和 i但是随着您的搜索的逐步发展,您可能希望查找以 g 开头、以 lf 结尾并且其间具有一个字符的所有字符串为此,您可以使用另一个特殊字符,即句点 (.)g.lf这将查找以 g 开头和以 lf 结尾并且其间具有一个字符的所有字符串若要将您的搜索扩展到以 g 开头和以 f 结尾并且其间具有两个字符的所有字符串,您可以使用两个句点:g..f使用 grep 来搜索文件现在您已经对正则表达式背后的概念有了基本的了解,您可以开始使用实际的示例,以便能够看到它们的实际运用。

    您将试验的第一个命令行应用程序是 grepgrep 的名称实际上就来自于正则表达式:g/RE/pgrep 用于在一个或多个文件中搜索特定字符串的实例缺省情况下,grep 输出其中出现了您的搜索字符串的每一行(而不是仅输出搜索字符串)如果您在多个文件中执行搜索,则 grep 还会输出在其中找到该行的文件名使用以下文本创建一个名为 grep.txt 的文件:I like golf.Golf is played on grass.I created gilf.grep 的基本语法如下:grep REGULAREXPRESSION FILENAME(S)基本搜索现在,返回到前面的第一个正则表达式示例:单独的单词 golf若要与 grep 一起使用这个表达式,可输入:grep golf grep.txt此命令在 grep.txt 文件中搜索字符串 golf 的所有实例,并输出包含该字符串的行您的输出应该类似如下:I like golf.使用方括号下一步,试验一些上面讨论过的特殊字符您可以使用方括号(方括号表达式)来指示您想要搜索 golf 和 Golf:grep [gG]olf grep.txt输出应该类似如下:I like golf.Golf is played on grass.句点若要搜索 golf 和 gilf,您同样可以使用方括号。

    取而代之的是,可以尝试使用一个句点来指示您想要搜索 g 和 lf 之间的任何字符:$grep g.lf grep.txt输出应该类似如下:I like golf.I created gilf.搜索 golf、Golf 和 gilf您现在已经找到了获得每种 golf 变体的方法,但是还没有哪个搜索返回了所有三个实例:golf、Golf 和 gilf花点时间考虑一下如何搜索所有三个实例这可以通过多种方法来实现下面是两个示例:grep ..lf grep.txtgrep [gG][oi]lf grep.txt这两种方法都返回所有三行:I like golf.Golf is played on grass.I created gilf.短横线您是否能够想出更多的方法来完成此任务呢?到目前为止,您仅学习了两个在正则表达式中使用的特殊字符这只是开始!有些特殊字符在其他特殊字符之内使用例如,当您将一组字符包括在方括号中时,您可以使用短横线 (-) 来搜索一系列字符将以下行添加到您的文本文件:What is g2lf?使用您到目前为止已学到的知识,您知道如果使用类似于 g.lf 或 g[oi2]lf 的正则表达式,则这一行将包括在搜索结果中。

    使用句点将返回在该位置具有任何字符的结果;使用 [oi2] 将返回仅在该位置具有 o i 或 2 的结果通过使用一个短横线,您可以实现第三种方法,其中不只包括少数字符,但并不是包括每个字符:grep g[a-z]lf此方法产生以下输出:I like golf.I created gilf.从输出中可以看到,此方法搜索落在 a 和 z 之间的任何字符(按字母顺序)这排除了在 g 和 lf 之间具有数字或符号的字符串,这些字符串不是真正的单词,可能不属于您所需的搜索条件方括号中的短横线通过在方括号中包括附加集合,您还可以搜索多个字符序列例如,若要搜索 a-z 和 A-Z,可以使用以下搜索:grep g[a-zA-Z]lf脱字号 (^)当您的字符序列列表变得更长时,可能发现通过避免某些字符而不是指定想要查找的字符来进行搜索会更容易这可以通过在搜索序列前在方括号中使用脱字符 (^) 来实现这说起来挺复杂的,但是通过观察一个示例,应该是很容易理解的通过使用以下 grep 命令来更改您的搜索,以避免数字但是包括所有其他字符:grep g[^0-9]lf此搜索类似于前面查找所有字母字符的搜索,但是此搜索还返回诸如数字符号 (#) 和美元符号 ($) 等不属于字母并且也不在您排除的数字序列中的字符。

    星号要试验的下一个特殊字符是星号 (*),它是若干个重复操作符之一大多数人都非常熟悉在命令行上使用星号作为文件名搜索条件(通配符),但是在正则表达式中使用星号还是相当新鲜的星号指示搜索项(前一个字符或方括号表达式)可以出现零次、一次或多次若要对此进行尝试,请将以下行添加到您已经在使用的 grep.txt 文件:This time the o is missing in glf.Some people might say goolf.But they would not say goilf.现在整个文件应该类似如下:I like golf.Golf is played on grass.I created gilf.What is g2lf?This time the o is missing in glf.Some people might say goolf.But they would not say goilf.尝试在 golf 中的 o 后面使用星号:grep go*lf grep.txt您的搜索将返回具有单词 golf、glf 和 goolf 的行:I like golf.This time the o is missing in glf.Some people might say goolf.问号另一个重复操作符是问号 (?)。

    问号的功能与星号类似,只不过搜索项可以出现零次或一次多个实例将不匹配使用问号取代星号来尝试您刚才执行的搜索:grep go?lf grep.txt可以看到,这次作为匹配结果返回了 golf 和 glf,但是没有返回 goolf,因为其中存在问号前的搜索项 o 的多个实例:I like golf.This time the o is missing in glf.加号最后一个常规重复操作符是加号 (+)加号将查找某个搜索项出现一次或多次的情况与星号不同,必须至少找到一个实例才会匹配请尝试以下示例:grep go+lf grep.txt这次,该搜索返回 golf 和 goolf,但它不返回 glf,因为没有找到 o:I like golf.Some people might say goolf.行首和行尾定位点在转向 sed 之前,最后要学习的特殊字符是行首定位点(使用脱字符来实现)和行尾定位点(使用美元符号来实现)您可能记得,您在本教程的前面使用过脱字符来对方括号表达式取反当在方括号之外使用脱字符时,它执行完全不同的功能将脱字符放在正则表达式开头将告诉该搜索仅操作行的开头换句话说,正则表达式中的第一个字符(脱字符之后)必须与新行上的第一个字符匹配才能匹配该行。

    类似地,将美元符号放在正则表达式的结尾以指示您仅希望返回与行尾匹配的结果换句话说,正则表达式中的最后一个字符(美元符号之前)必须与某行上的最后一个字符匹配才能匹配该行若要对此进行测试,请将以下两行添加到 grep.txt:golf has been a fine examplelet's talk about something besides golf请注意,对于此测试,您不应该对 golf 进行大写或加标点,因为它将演示一个针对同一单词的搜索,此搜索使用定位点在行尾或行首以不同的方式操作若要测试行首定位点,请输入以下命令:grep ^golf grep.txt输出应该类似如下:golf has been a fine example若要测试行尾定位点,请使用同一个搜索,但是删除脱字符并在 golf 之后添加一个美元符号grep golf$ grep.txt使用行尾定位点的输出类似如下:let's talk about something besides golf小结现在您已经通过在命令行上使用 grep 来学习了正则表达式的基础知识下一步,您将学习使用 sed,此实用程序不仅搜索文本,而且还对搜索结果进行替换。

    首先,下面是对您到目前为止已学习过的内容的小结:. 句点表示任何单个字符[] 方括号包括一个字符序列- 短横线在字符之间使用以创建一个序列(在 [] 内)^ 脱字符用于对序列(在 [] 内)取反* 星号搜索某个搜索项的零个、一个或多个实例? 问号搜索某个搜索项的零个或一个实例+ 加号搜索某个搜索项的一个或多个实例$ 美元符号搜索行尾^ 脱字符搜索行首\ 特殊字符前的反斜杠使该字符成为普通字符(请参见下一部分使用 sed 来编辑文件sed 是流编辑器 (stream editor) 的简写文本编辑器的传统、现代定义是可用于创建和编辑文本文件的交互式应用程序sed 也是一个文本编辑器,但它是一个命令行实用程序而不是交互式实用程序,从而使之成为一个极其强大的批处理编辑工具sed 通常在 UNIX Shell 脚本中用于过滤较大的文本文件集在本教程的第一部分中,您使用了一个讨论 golf 的小型测试文件为了演示 sed 编辑器的高级功能,您将使用一个很小的代码片段,开发人员可能希望在批处理过程中更改该代码片段请将以下文本复制并粘贴到一个名为 sed.txt 的文件中:system "echo 'project:$project' >> logfile";system "echo 'version:$version' >> logfile";system "echo 'optionalid:$optionalid' >> logfile";system "echo 'nodes:$nodes' >> logfile";system "echo 'threads:$threads' >> logfile";正斜杠前面解释过的用于 grep 的所有特殊字符在 sed 中也有效。

    然而,若要使用 sed,您必须了解一些附加语法sed 中的基本表达式由四个部分组成,各个部分之间用正斜杠 (/) 分隔以下是用于基本 sed 命令的常见语法:sed s/REGULAREXPRESSION/REPLACEMENTSTRING/flags INPUT_FILEs——搜索和替换s 指示您希望执行搜索和替换正斜杠用于绑定 sed 中的正则表达式例如,如果您只希望将词条 logfile 替换为 logfile.txt,则可以运行以下命令:sed s/logfile/logfile.txt/ sed.txt输出应该类似如下:system "echo 'project:$project' >> logfile.txt";system "echo 'version:$version' >> logfile.txt";system "echo 'optionalid:$optionalid' >> logfile.txt";system "echo 'nodes:$nodes' >> logfile.txt";system "echo 'threads:$threads' >> logfile.txt";在此情况下要注意的一个要点在于,sed 不会实际更改 sed.txt 的内容。

    相反,它将输出发送到标准输出设备对于这些示例,您将把输出发送到标准输出设备,以便能够立即看到操作结果为便于将来参考,可以捕获输出或将其发送到某个新文件例如,若要将输出发送到 sed_new.txt,可以运行以下命令:sed s/logfile/logfile.txt/ sed.txt > sed_new.txt反斜杠在学习使用斜杠的同时,还有另一个非常重要的特殊字符需要学习反斜杠 (\) 称为转义字符,因为它对正则表达式解释中的下一个字符进行转义更简单的是,将一个反斜杠放在特殊字符前,将使该字符成为普通项而不是命令项这非常重要,因为许多文件(尤其是在编写代码的时候)广泛利用了与用于执行正则表达式的字符相同的字符在您的 sed.txt 文件中,您会注意到美元符号的使用如果您希望替换 $project 而不替换 project,则需要在搜索和替换中使用转义字符:sed s/\$project/\$project_name/ sed.txt您可以在输出中看到 $project 被更改了,但是 project 没有被更改system "echo 'project:$project_name' >> logfile";system "echo 'version:$version' >> logfile";system "echo 'optionalid:$optionalid' >> logfile";system "echo 'nodes:$nodes' >> logfile";system "echo 'threads:$threads' >> logfile";更改某个项的多个实例这引入了 sed 中的另一个重要功能。

    如果您希望同时更改 project 的两个实例,该怎么办呢?通过到目前为止已学到的知识,合理的回答是只需使用 project 作为正则表达式,但是此回答并不是非常正确下面将继续并进行尝试,以便能够演示和解释该过程:sed s/project/project_name/ sed.txt在输出中可以看到,project 的第一个实例被更改为 project_name:system "echo 'project_name:$project' >> logfile";system "echo 'version:$version' >> logfile";system "echo 'optionalid:$optionalid' >> logfile";system "echo 'nodes:$nodes' >> logfile";system "echo 'threads:$threads' >> logfile";然而,第二个实例未更改,尽管它肯定匹配您的正则表达式您从第一个示例中知道,sed 似乎更改其输入中的每个匹配字符串,而不是仅更改第一个匹配字符串,因为它更改 logfile 的每个实例。

    区别在于,logfile 的每个实例在单独的行上,而同一行上却有两个 project 实例这为什么非常重要?因为 sed 被实现为一个行编辑器它一次将一个单独的行放到内存中,并将其作为单个单元来操作在运行 sed 时务必记住这点,因为所有命令行选项都是按这个设计原则来设计的(从而使大多数 sed 实现不会受到与系统内存有关的文件大小限制)缺省情况下,每一行都视为 sed 命令的一次新的执行尽管在第一个示例中似乎不是这样,但是其中 sed 命令仅替换匹配字符串的第一个实例然而,您可以简单地使用一个 g 标志来改变此行为g 标志执行同样的 sed 命令,但这次在结尾附加一个 g:sed s/project/project_name/g sed.txt这次,第一行上的两个 project 实例都被更改为 project_name:system "echo 'project_name:$project_name' >> logfile";system "echo 'version:$version' >> logfile";system "echo 'optionalid:$optionalid' >> logfile";system "echo 'nodes:$nodes' >> logfile";system "echo 'threads:$threads' >> logfile";您可能记得,g 是 global 的简写。

    运行初步的搜索sed 的另一个强大功能是在搜索和替换操作前运行初步搜索,以确定当前是否在您希望执行命令的行上这差不多类似于在 sed 中执行 grep在您的例子中,您可能希望更改 node 变量的日志文件,而不是将它与所有其他输出分组在一起为此,您需要将字符串 logfile 更改为 logfile_nodes,但是仅在属于节点的行上执行更改以下命令可以确切完成此任务:sed /nodes/s/logfile/logfile_nodes/ sed.txt下面是其输出:system "echo 'project:$project' >> logfile";system "echo 'version:$version' >> logfile";system "echo 'optionalid:$optionalid' >> logfile";system "echo 'nodes:$nodes' >> logfile_nodes";system "echo 'threads:$threads' >> logfile";更改以冒号结尾的每个字符串现在,尝试使用一些您在使用 grep 时学习到的正则表达式知识,不过这次是在 sed 命令中使用。

    通过在 sed 中使用以下正则表达式,您可以更改以冒号结尾的每个字符串:sed s/[a-z]*:/value:/g sed.txt输出应该类似如下:system "echo 'value:$project' >> logfile";system "echo 'value:$version' >> logfile";system "echo 'value:$optionalid' >> logfile";system "echo 'value:$nodes' >> logfile";system "echo 'value:$threads' >> logfile"; 这相当酷,但不是非常合理它不是非常合理的原因在于,您的所有变量前都有单词 value,没有办法对各个变量进行区分然而,通过使用 sed 的另一个功能,您可以使这转变为一个实际的示例 “和”号“和”号 (&) 表示与您的正则表达式匹配的字符串换句话说,如果 [a-z]*: 在某个特定行上被证明为 project:,则“和”号将包含该值这会非常有用看一下以下这个示例:sed s/[a-z]*:/new_\&/g sed.txt这次,您修改了每个匹配字符串,但是保留了与每个变量关联的标识符:system "echo 'new_project:$project' >> logfile";system "echo 'new_version:$version' >> logfile";system "echo 'new_optionalid:$optionalid' >> logfile";system "echo 'new_nodes:$nodes' >> logfile";system "echo 'new_threads:$threads' >> logfile";执行多个命令序列使用 sed,您还可以一次做多件事情。

    若要一次执行多个命令序列,您必须在每个表达式前使用 -e 标志缺省情况下,sed 将第一个参数解释为一个表达式,但是在运行多个命令时,您需要作出更明确的指定,因此要使用 -e 标志例如:sed -e s/[a-z]*:/value:/g -e s/logfile/name/g sed.txt可以在此例中看到,sed 在适当位置插入了 value: 和 name:system "echo 'value:$project' >> name";system "echo 'value:$version' >> name";system "echo 'value:$optionalid' >> name";system "echo 'value:$nodes' >> name";system "echo 'value:$threads' >> name";正如您开始看到的,在大规模批处理过程中,sed 可以是个非常强大的文件编辑工具在前一示例中,您是在对单个文件进行操作,就像在使用 grep 时所做的那样不要忘了,这些实用程序的部分强大功能在于跨多个文件运行它们,这可以使用通配符或文件列表替换单个文件来实现,您已在本教程中这样使用过了。

    在命令行上使用 awk本教程首先对正则表达式进行了基本的解释,然后介绍了 grep 和 sedgrep 是一个强大的搜索实用程序,而 sed 则是一个更加强大的搜索和替换实用程序awk 则更进一步,它在全功能的命令行编程语言中使用正则表达式正如 sed 一样,当在命令行上使用 awk 时,它接受基于行的输入awk 一次解释一行输入,但是与 sed 不同,它将该行上的每个部分作为变量来处理,这些变量可用作内联代码的输入和输出应该指出的是,AWK(大写)是一个可用于编写脚本(而不只是在命令行上使用)的全功能编程语言,但本教程集中于 awk,后者是动态解释 AWK 命令的命令行实用程序顺便提一下,任何人阅读到这里都会考虑如何实际运用所学到的知识,我刚才就使用 grep 在某些旧代码中搜索理想的 awk 示例:grep awk */*.pl大多数系统管理员或程序员每天都会看到这些工具的应用下面是我的输出中的一些行:Edaemon/m_checkcurrentdisk.pl:$freespace = `awk '(NR==1) {print \$4 / 1024 / 1024}' grep.tmp`;Edaemon/m_getdatetime.pl:$month = `awk '(NR==1) {print \$2}' datetime.txt`;Odaemon/odaemon.beowulf.dvd.pl:$filesize = `awk '(NR==1) {print \$1}' temp.txt`;这些是非常好的示例,因为它们说明了非常基础的 awk 应用。

    对于您的第一次尝试,甚至可以使它更简单对于您的 awk 测试,请在一个空目录中创建以下文件(每个文件的内容无关紧要,并且它们可以是空的)Screenshot_1.jpgScreenshot_2.jpgScreenshot_3.jpgawk.txtregular.txtsed.txt使用 ls 的输出作为 awk 的输入缺省情况下,awk 读取输入文件中的每一行,并将内容分离为由空格确定的变量在非常简单的示例中,您可以使用 ls 的输出作为 awk 的输入并打印结果此示例结合使用管道字符 (|) 和 ls 来将输出发送到 awk:ls | awk ' { print $1 } 'awk 随后打印每行上的第一项,在此例中为每行上的唯一项:Screenshot_1.jpgScreenshot_2.jpgScreenshot_3.jpgawk.txtregular.txtsed.txt使用 ls -l 来为 awk 生成多列输入这确实是非常基本的功能对于下一个示例,请使用 ls -l 来为 awk 生成多列输入:ls -l不同系统的 ls 实现稍有差别,下面是一些示例输出:total 432-rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg-rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg-rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg-rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.txt-rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.txt-rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.txt请注意,文件所有者是每行上的第三个项,文件名是每行上的第九个项(缺省情况下,awk 中的项之间用空格分隔)。

    通过打印每行上的第三和第九个变量,您可以使用 awk 来从该列表提取文件所有者和文件名下面是完成这项工作的命令:ls -l | awk ' { print $3 " " $9 } '您将注意到,awk 中的 print 命令有两个引号,而且引号中有一个空格这只是为了在输出的文件所有者和文件名之间打印一个空格:guest Screenshot_1.jpgguest Screenshot_2.jpgguest Screenshot_3.jpgtuser awk.txttuser regular.txttuser sed.txt您可以在 awk 打印语句中的变量之间的引号中放置任何文本使用正则表达式来指定行现在您已经学习了如何使用 awk 的基础知识,但本教程不是关于正则表达式的吗?awk 中大量使用了正则表达式最常见的示例是在 awk 命令前附加一个正则表达式,用于指定您想要操作的行与 sed 一样,awk 中的正则表达式位于两个正斜杠之间例如,如果您只希望操作 tuser 所拥有的文件,则可以使用以下命令:ls -l | awk ' /tuser/ { print $3 " " $9 } '该命令产生以下输出:tuser awk.txttuser regular.txttuser sed.txt更改文件扩展名在另一个示例中,您可能希望更改每个文本文件的文件扩展名而不更改图像文件。

    为此,您将需要使用句点而不是空格来分隔输入变量,然后使用正则表达式来指示您仅希望搜索文本文件若要基于句点来分隔变量,可以使用 -F 标志,后跟后跟您希望使用的字符(用引号引起来)尝试此示例,通过管道将 awk 输出发送到某个 Shell(此 Shell 将执行 awk 生成的命令):s | awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } ' | bash后续的 ls -l 将显示新的文件名:-rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg-rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg-rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg-rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.doc-rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.doc-rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.doc记住,这些只是 awk 的入门基础知识,但是 AWK 是一种全功能的编程语言,所具有的功能远远超出了本教程所介绍的内容。

    请查看一下 awk man 页如果您希望学习更多的知识,花钱买一本优秀的图书是明智的总结本教程中的示例应该足以使您基本了解使用正则表达式的 UNIX 过滤器以及如何在命令行上使用它们所使用的三个实用程序 grep、sed 和 awk 都具有众多的内置选项和功能,这些内容大大超出了本教程讨论的入门课程的范围存在一些专门探讨 sed 和 awk 的书籍请仔细搜索一遍关于 grep 的 man 页以了解有关其强大功能的更多信息如果您觉得自己已掌握了正则表达式的基础知识,并希望进行下一步的学习,可以考虑学习 Perl,它是另一种充分利用了正则表达式的卓越语言不熟悉的用户在掌握 Perl 以后,原本似乎没有意义的字符串竟变成了紧凑而高效的代码行,真的很有意思!如果您学习了本系列中的每个教程,那么您现在已经学会了如何在命令行上操作基本文件、如何使用 vi 文本编辑器和如何使用命令行过滤器 请密切关注本系列中的下一个教程,其中将介绍 Shell 诀窍和技巧与此同时,您还应该竭尽所能地学习正则表达式和本教程中的实用程序它们使您可以将很长的复杂任务转换为值得骄傲的快捷、一流的解决方案!参考资料 学习· UNIX 新手指南:查看本系列中其他部分。

    · sed & awk (O'Reilly,1997 年 3 月):这是了解有关 sed 和 awk 的更多信息的理想参考资料· AWK:此网站探究了有关 AWK 的更多细节· "Common threads:Awk by example, Part 1"(developerWorks,2000 年 12 月):这篇文章介绍了 awk 并探究了有关作为编程语言的 awk 的更多细节· AIX and UNIX 文章:查看 Tim McIntire 撰写的其他文章· AIX and UNIX:访问 developerWorks “AIX and UNIX” 专区,以扩展您的 AIX 和 UNIX 技能· AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面,以了解更多关于 AIX 和 UNIX 的内容· developerWorks 技术事件与网络广播:了解最新的 developerWorks 技术事件和网络广播· AIX 5L Wiki:AIX 相关技术信息的协作环境· Podcasts:收听 Podcast 并与 IBM 技术专家保持同步获得产品和技术· IBM 试用软件:使用 IBM 试用软件开发您的下一个项目,可直接从 developerWorks 下载这些试用软件。

    讨论· 参与“AIX and UNIX”论坛: o AIX 5L——技术 o AIX for Developers 论坛 o 集群系统管理 o IBM Support Assistant o 性能工具——技术 o 虚拟化——技术 o 更多“AIX and UNIX”论坛 · 参与 developerWorks blogs,从而加入到 developerWorks 社区中来关于作者Tim McIntire 是 Cluster Corporation 的咨询师和创始人之一,该公司是 HPCC 软件、支持和咨询的市场领跑者他还定期向 IBM developerWorks 和 Apple Developer Connection 投稿Tim 领导 Oceanography 的 Digital Image Analysis Lab 的 Scripps Institution 进行了计算机科学方面的研究工作,在各种期刊上发表了相关研究成果,包括 Concurrency and Computation 和 IEEE Transactions on Geoscience and Remote Sensing。

    您可以访问 TimMcI 以了解更多关于 Tim 的信息。

    点击阅读更多内容
    卖家[上传人]:仙人指路
    资质:实名认证