在你开始前

了解对本教程的期望以及如何最大程度地利用本教程。

关于本系列

这个由四部分组成的教程系列从头开始涵盖UNIX®。 最初的教程对于那些远离UNIX操作系统已有一段时间的用户来说是一个很好的补充。 对于来自Windows®背景的全新UNIX用户,它也很有用,因为它使用对Windows的引用和比较。 第二个教程着重于vi文本编辑器,它是最强大(也是最神秘的)UNIX实用程序之一。 本教程教您有关使用正则表达式(包括grepsedawk的UNIX命令行过滤器的信息。

关于本教程

要释放UNIX命令行过滤器(如grepsedawk背后的功能,需要对正则表达式有深入的了解。 本教程向新用户教授这些实用工具的功能以及如何使用正则表达式来操纵文本。 您将通过使用带有grep简单,有趣的示例开始,然后进入sedawk真实示例。

目标

本教程的目的是使UNIX和Linux®用户熟悉三个功能强大的命令行工具,这些工具可用于快速有效地搜索和更改数据。 本教程的开头介绍了许多UNIX实用程序(和编程语言)的基本框架中使用的正则表达式。 以下各节提供了将正则表达式与grepsedawk一起使用的示例。

先决条件

您需要对本教程的命令行有基本的了解。 对于本教程的某些部分,了解如何在UNIX中使用stdinstdoutpipe处理输入和输出也很有帮助。

系统要求

要完成本教程,只需要在运行任何类似UNIX的操作系统的任何计算机上访问用户帐户即可。 类似UNIX的操作系统包括IBMAIX®操作系统,Linux,Berkeley软件发行版(BSD),MacOS®X(使用终端机访问命令行)以及许多其他操作系统。

常用表达

正则表达式是一个字符串,旨在搜索或替换另一个字符串。 乍一看,这似乎是一个非常基本的功能。 大多数用户几乎对每个图形文本编辑器或文字处理应用程序都熟悉简单的搜索和替换功能。 如果将此基本搜索和替换功能与计算器进行比较,则可以将正则表达式与成熟的计算机进行比较。 使用正则表达式作为搜索条件的功能不应被低估。

使用正则表达式的过滤器

一些最强大的基于UNIX的命令行工具使用正则表达式,包括grepsedawk (以及某些编程语言,包括Perl)。 学习如何使用正则表达式是从UNIX命令行的基本用户转变为真正的超级用户的必需步骤。 正则表达式语法有几种不同的版本, grepsedawk多种版本,因此本教程重点介绍在每种实现中相当标准的最常见构造。 不要忘记参考系统的man页以获取语法和命令行选项的详细信息。

基础

在探索使用正则表达式的UNIX应用程序之前,重要的是要学习基础知识。 在本节中,请继续阅读。 稍后,您将在grep尝试一些示例。

基本搜索

正则表达式使用正常字符的字符串以及指示搜索条件的特殊字符组合。 在最基本的情况下,根本不使用特殊字符。 例如,如果您只想使用术语“ golf作为搜索条件,则键入以下内容:

golf

这是一个正则表达式! 它搜索单词golf所有实例。 正则表达式区分大小写,因此此搜索将找到g olf所有实例,但不会找到G olf实例。

使用括号

要同时搜索g olfG olf ,可以使用方括号(正则表达式中的特殊字符)并列出要搜索的单个字符的字符串。 这类似于搜索内的搜索(这是正则表达式背后的魔力)。

[Gg]olf

相同的概念适用于任何字符列表-不仅用于区分大小写。 例如,您可能要搜索golfgelf ,这是一项新的运动,它由您组成:

g[oe]lf
时期

现在,假设您还有第三项运动gilf ,您也想检查一下。 一种使用到目前为止所学知识的方法是在搜索条件中使用oei 。 但是随着搜索量的增长,您可能希望找到所有以g开头和以lf结尾且中间有一个字符的字符。 为此,请使用另一个特殊字符,即句点(。)。

g.lf

这将查找所有以g开头并以lf结尾且之间有一个字符的字符串。 要将搜索扩展到所有以g开头和以f结尾且中间有两个字符的字符串,可以使用两个句点:

g..f

用grep搜索文件

现在,您已经对正则表达式背后的概念有了基本的了解,是时候开始使用实际示例了,以便您可以实际使用它们了。 您将尝试使用的第一个命令行应用程序是grepgrep实际上是从正则表达式g/RE/p获得其名称的。 grep用于在一个或多个文件中搜索特定字符串的实例。 默认情况下, 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.

使用括号

接下来,尝试使用上面讨论的一些特殊字符。 您可以使用方括号(方括号表达式)表示您要搜索golfGolf

grep [gG]olf grep.txt

输出看起来像这样:

I like golf. Golf is played on grass.

时期

要搜索golfgilf ,可以再次使用括号。 相反,尝试使用句点来表示您要搜索glf之间的任何字符:

$grep g.lf grep.txt

输出看起来像这样:

I like golf. I created gilf.

搜索高尔夫,高尔夫和吉尔夫

现在,您已经找到了获取每种golf变化的方法,但是您的搜索都没有返回全部三个实例: golfGolfgilf 。 花点时间考虑一下如何搜索这三个。 有多种方法可以做到这一点。 这是几个例子:

grep ..lf grep.txt grep [gG][oi]lf grep.txt

两种方法都返回所有三行:

I like golf. Golf is played on grass. I created gilf.

短跑

您能想到其他方法吗? 到目前为止,您仅学习了在正则表达式中使用的两个特殊字符。 这仅仅是开始! 一些特殊字符在其他特殊字符内使用。 例如,当您将一组字符括在方括号中时,可以使用破折号(-)搜索一系列字符。 将以下行添加到您的文本文件:

What is g2lf?

到目前为止,您已经了解到,如果您使用g.lfg[oi2]lf类的正则表达式,将在搜索结果中包含此行。 使用句点可返回结果,其中该位置有任何字符; 使用[oi2]返回的结果仅是o i2在该位置。 您可以使用破折号来实现第三个方法,该方法包括多个字符,但不是每个字符:

grep g[a-z]lf

此方法产生以下输出:

I like golf. I created gilf.

从输出中可以看到,此方法搜索介于az之间a任何字符(按字母顺序)。 这不包括数字或符号介于glf之间的字符串,这些字符串或符号不是真正的单词,并且可能不属于所需搜索条件。

括号内的破折号

您还可以通过在括号内包括其他字符集来搜索多个字符序列。 例如,要搜索azAZ ,请使用以下搜索:

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.

尝试在golfo后使用星号:

grep go*lf grep.txt

您的搜索返回包含单词golfglfgoolf

I like golf. This time the o is missing in glf. Some people might say goolf.

问号

另一个重复运算符是问号(?)。 问号的功能类似于星号,除了搜索项可以出现零或一次。 多次出现将不匹配。 尝试使用问号而不是星号来执行刚刚执行的搜索:

grep go?lf grep.txt

如您所见,这次将golfglf作为匹配结果返回,但是goolf并不是因为在问号之前有多个搜索项o实例:

I like golf. This time the o is missing in glf.

加号

通用重复运算符的最后一个是加号(+)。 当搜索项出现一次或多次时,将找到一个加号。 与星号不同,必须找到至少一个匹配项。 请尝试以下示例:

grep go+lf grep.txt

这次,搜索返回golfgoolf ,但没有返回glf因为未找到o

I like golf. Some people might say goolf.

行首和行尾锚

在继续使用sed之前要了解的最后一个特殊字符是:行首锚(使用插入符号实现)和行尾锚(使用美元符号实现)。 您可能还记得在本教程前面使用插入号来否定方括号表达式。 在支架之外使用插入号时,它会执行完全不同的功能。 将插入号放在正则表达式的开头可指示搜索仅在行的开头进行。 换句话说,正则表达式中的第一个字符(在插入号之后)必须与新行中的第一个字符匹配,搜索才能匹配该行。 同样,在正则表达式的末尾放置一个美元符号,以表示您只想返回与行尾匹配的结果。 换句话说,您的正则表达式中的最后一个字符(在美元符号之前)必须与行中的最后一个字符匹配,搜索才能与该行匹配。 要对此进行测试,请将以下两行添加到grep.txt中:

golf has been a fine example let'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 ,它不仅搜索文本,还将替换它。 首先,这是到目前为止所学知识的回顾:

. A period represents any single character [] Brackets enclose character sequences - A dash is used between characters to create a sequence (inside []) ^ A carrot is used to negate a sequence (inside []) * An asterisk searches for zero, one, or many instances of a search item ? A question mark searches for zero or one instance of a search item + A plus sign searches for one or many instances of a search item $ A dollar sign searches the end of a line ^ A carrot searches the beginning of a line \ A backslash preceding a special character makes it a plain character (See the next section.)

使用sed编辑文件

sed是流编辑器的缩写。 文本编辑器的传统的现代定义是一个交互式应用程序,可用于创建和编辑文本文件。 sed还是文本编辑器,但它是命令行实用程序,而不是交互式实用程序,这使其成为批处理编辑的极其强大的工具。 sed通常在UNIX shell脚本中用于过滤大量文本文件。 在本教程的第一部分中,您使用了一个讨论高尔夫的小测试文件。 为了演示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_FILE

s-搜索和替换

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似乎更改了输入中的每个匹配字符串,而不仅仅是第一个匹配项,因为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另一个功能将其变成一个真实的示例。

&符

“与”号(&)表示正则表达式匹配的字符串。 换句话说,如果[az]*:证明是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

本教程首先介绍了正则表达式,然后介绍了grepsedgrep是功能强大的搜索实用程序,而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.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt

使用ls的输出作为awk的输入

默认情况下, awk读取输入文件中的每一行,并将内容分成由空格确定的变量。 在一个非常简单的示例中,您可以将ls的输出用作awk输入并打印结果。 本示例使用带有管道字符(|)的ls将输出发送到awk

ls | awk ' { print $1 } '

随后, awk在每一行上打印第一项,在这种情况下,这是每一行上的唯一项:

Screenshot_1.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt

使用ls -l生成awk的多列输入

那真的很基本。 在下一个示例中,使用ls -lawk生成多列输入:

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 } '

您会注意到awkprint命令有两个引号和一个空格。 这只是在输出中的文件所有者和文件名之间打印一个空格:

guest Screenshot_1.jpg guest Screenshot_2.jpg guest Screenshot_3.jpg tuser awk.txt tuser regular.txt tuser sed.txt

您可以在awk打印语句中的变量之间用引号引起来的文本。

使用正则表达式指定行

现在,您已经了解了如何使用awk的基础知识,但是本教程不是关于正则表达式的吗? 在awk ,正则表达式被大量使用。 最常见的示例是在awk命令之前加一个正则表达式,该正则表达式指定要操作的行。 与sedawk中的正则表达式封装在正斜杠中。 例如,如果您只想对tuser拥有的文件进行操作,则可以使用以下命令:

ls -l | awk ' /tuser/ { print $3 " " $9 } '

该命令产生以下输出:

tuser awk.txt tuser regular.txt tuser sed.txt

更改文件扩展名

在另一个示例中,您可能想要更改每个文本文件的文件扩展名而不触摸图像文件。 为此,您需要使用句点而不是空格来分隔输入变量,然后使用正则表达式表示您只想搜索文本文件。 要基于句点拆分变量,请使用-F标志,后跟要在引号中使用的字符。 尝试以下示例,将awk输出通过管道传递到外壳程序(它将执行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页。 如果您想学习更多,明智的做法是购买一本好书。

Wrapping up

本教程中的示例应该足以使您基本了解使用正则表达式的UNIX过滤器以及如何在命令行上使用它们。 使用的三个实用程序grepsedawk具有许多内置选项和功能,这些功能远远超出了本教程中讨论的开始课程。 有些书专门讨论sedawk 。 在grepman页中搜索以了解有关其功能的更多信息。

如果您觉得自己已经掌握了正则表达式的基础知识并想迈出下一步,那么Perl是另一种很棒的语言,它可以充分利用正则表达式。 Perl的高手喜欢那些简明而又高效的代码行,对于陌生的用户来说,这似乎是毫无意义的字符串。

如果您已按照本系列中的每个教程进行了学习,那么现在您已经了解了命令行上的基本文件操作,如何使用vi文本编辑器以及如何使用命令行过滤器。

请密切注意本系列的下一篇教程,该教程将介绍Shell技巧和窍门。 同时,在本教程中,您将学习有关正则表达式和实用程序的所有知识。 它们使您可以将漫长而复杂的任务变成您引以为傲的快速,优雅的解决方案!






翻译自: https://www.ibm.com/developerworks/aix/tutorials/au-unixtips3/index.html